floating point verification using is?
bearophile
bearophileHUGS at lycos.com
Fri Dec 18 13:15:30 PST 2009
4th try, getting there, this helps if in your compiler real == double:
import std.traits: isFloatingPoint;
import std.c.stdio: printf;
bool isInitNaN(T)(T x) if (isFloatingPoint!T) {
union FPData {
T f;
static if (T.sizeof == uint.sizeof)
uint data;
else static if (T.sizeof == ulong.sizeof)
ulong data;
else
ubyte[T.sizeof] data;
}
static FPData fnan, fpd;
fpd.f = x;
return fnan.data == fpd.data;
}
void main() {
printf("%d\n", isInitNaN(2.5f));
printf("%d\n", isInitNaN(2.5));
printf("%d\n", isInitNaN(2.5L));
float xf;
printf("%d\n", isInitNaN(xf));
xf = 2.5;
printf("%d\n", isInitNaN(xf));
double xd;
printf("%d\n", isInitNaN(xd));
xd = 2.5;
printf("%d\n", isInitNaN(xd));
float xr;
printf("%d\n", isInitNaN(xr));
xr = 2.5;
printf("%d\n", isInitNaN(xr));
}
More information about the Digitalmars-d-learn
mailing list