in reply to Re^4: Need more precision.
in thread Need more precision.
0.00000000000000002025 is 21 digits, so obviously you need more than 18 digits.
Using a single byte for the fixed point will get me down to +-1e-127
I think you are misunderstanding "fixed point". Fixed point means the exponent part is always the same. For example, with 64 bit signed integers:
But you need more than 18 digits, so you need to cascade. Though I misspoke. What you cascade depends the underlying hardware. For a PC with 64 bit integers, you need to cascade 3 or 4 32 bit integers to your needed digits. For a PC with 32 bit integers, you need to cascade at least 5 16 bit integers.
Let's assume your PC has 64 bit integers. To add 2 numbers, A and B, you split them into Ah, Am, Al, Bh, Bm and Bl, then do the additions:
/* C */ sint64_t A, B, Ah, Am, Al, Bh, Bm, Bl, Ch, Cl, /* etc */; sint128 C; Al = A & 0xFFFFFFFF; Am = A >> 32; Ah = A >> 64; Bl = B & 0xFFFFFFFF; Bm = A >> 32; Bh = A >> 64; Cl = Al + Bl; Cm = Am + Bm + (Cl >> 32); Ch = Ah + Bh + (Cm >> 32); C = (Ch << 64) + ((Cm & 0xFFFFFFFF) << 32) + (Cl & 0xFFFFFFFF);
Of course, there are some easy optimizations to this I leave as an exercise for the reader. Also leaving subtraction, multiplication and division as exercises for the reader.
Note: sint64_t and sint128_t are the C99 standard type names for "exactly 64/128 bit, signed integer"
Welcome to the world of "bit bashing".
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^6: Need more precision.
by BrowserUk (Patriarch) on Jun 10, 2015 at 19:49 UTC |