This:
typedef union { struct { unsigned sign : 1; unsigned exponent :11; U64 mantissa :52; }; double d; U64 u; } DFields;
Should be this:
typedef union { struct { U64 sign : 1; U64 exponent :11; U64 mantissa :52; }; double d; U64 u; } DFields;
Turns out that unless all the bit fields are defined to be of the same unsigned type, they will not be mapped to the same unit of memory.
I originally had them all defined as just unsigned; but the compiler complained that the mantissa was too large for a 32-bit uint. So, I switch it to U64 and it compiled.
The problem is that produces a struct that occupies more than 64-bits. The first two bitfields are merged into a U32, but because the third is a different underlying type, it gets mapped to a different chunk of uninitialised memory. Hence, the apparently random nature of the output.
Making all three fields the same type means they get amalgamated into a single 64-bit piece of ram. (But it took some searching to locate this rather arcane piece of knowledge.)
In reply to Re^2: IC problem.[Solved, (feel free to reap)]
by BrowserUk
in thread IC problem.[Solved, (feel free to reap)]
by BrowserUk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |