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".
In reply to Re^5: Need more precision.
by RonW
in thread Need more precision.
by BrowserUk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |