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.)
With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
|