a way to specily floating-point numbers as bit patters
Basile B. via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Fri Jun 9 09:36:08 PDT 2017
On Friday, 9 June 2017 at 16:07:36 UTC, ketmar wrote:
> let's say that i have precomputed some `float`-typed tables,
> and now i want to use 'em in my code. for example, a table for
> Lagrange series. the table itself is like 10 numbers, but the
> code calculating it rather big, and it depends of architecture
> (so it can yield different results on different arch). yet i
> want the same IEEE numbers everywhere.
>
> the code problem is that i really can't express *exactly* *the*
> *same* IEEE float with D. let me illustrate this.
>
> one of my calculated values is `-0.166667`, which has
> bit-pattern of 0xBE2AAAB7.
> now, let's say i want to use this number in my code:
>
> float v = -0.166667f;
> writefln("%f 0x%08X", v, *cast(uint*)&v);
>
> oooops. "-0.166667 0xBE2AAAC1". it's not the same! (and yes, it
> matters).
-0.166667f is not representable as a 32 bit float. The actuall
value that's stored is -0.16666699945926666259765625, hence the
difference. See
https://www.h-schmidt.net/FloatConverter/IEEE754.html and enter
your value in the field labeled "You entered".
> and this means that i can't inline my calculated values! each
> time i want to get floating value with a known bit-pattern, i
> have to store it as uint, and resort to ugly hack:
> `*cast(immutable(float)*)(&mytable[2])`.
>
> and i can't do this trick in CTFE, as such pointer tricks
> aren't permitted.
>
> i tried different workarounds, but they're all ugly. it would
> be very nice to have a way to define IEEE floating point
> numbers as bit-patterns in the language itself. what do you
> think?
Yes, easy to do, a template alĂ octal or hexString.
> yes, i know that floating numbers has to be loaded from memory
> anyway, so my trick is not really worse than specifying the
> constant directly. but it is still dirty trick, and i cannot
> use it in @safe code too, so i have to mark my code as
> @trusted, which is not the same at all. there probably may be
> other trick such this for @safe code, but... you got the idea,
> i think.
More information about the Digitalmars-d-learn
mailing list