On Thursday, 12 December 2019 at 19:21:22 UTC, berni44 wrote:
Is it possible to get to the bits of a float in CTFE? I tried
the following, but this doesn't work:
```
import std.stdio;
union FloatBits
{
float floatValue;
ulong ulongValue;
}
ulong test(float f)
{
FloatBits fb;
fb.floatValue = f;
return fb.ulongValue;
}
void main()
{
static assert(test(3.0) == 1077936128);
}
```
test.d(13): Error: reinterpretation through overlapped field
ulongValue is not allowed in CTFE
test.d(18):called from here: test(3.0F)
test.d(18):while evaluating: static
assert(test(3.0F) == 1077936128LU)
You can use a C-style pointer reinterpret cast like this:
uint test(float f) { return *cast(uint*)&f; }
Make sure that source and destination types have the same size.
Or more generally:
IntegerOfSize!T bitRepresentation(T)(T f)
{
return *cast(IntegerOfSize!T*)&f;
}
pragma (msg, bitRepresentation(3.0f)); // 1077936128u
pragma (msg, bitRepresentation(3.0)); // 4613937818241073152LU
void main()
{
static assert(bitRepresentation(3.0f) == 1077936128);
}
template IntegerOfSize(T)
{
static if (T.sizeof == 1)
alias IntegerOfSize = ubyte;
else static if (T.sizeof == 2)
alias IntegerOfSize = ushort;
else static if (T.sizeof == 4)
alias IntegerOfSize = uint;
else static if (T.sizeof == 8)
alias IntegerOfSize = ulong;
else
static assert(0);
}