in reply to Re: IC problem.[Solved, (feel free to reap)]
in thread IC problem.[Solved, (feel free to reap)]
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.)
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^3: IC problem.[Solved, (feel free to reap)]
by cavac (Prior) on Jun 12, 2015 at 12:58 UTC | |
by BrowserUk (Patriarch) on Jun 12, 2015 at 14:04 UTC | |
by cavac (Prior) on Jun 12, 2015 at 14:11 UTC | |
by BrowserUk (Patriarch) on Jun 12, 2015 at 14:16 UTC |