This may be better, I have not taken a look at the resulting asm yet: import std.traits: isFloatingPoint; import std.c.stdio: printf;
bool isInitNan(T)(T f) if (isFloatingPoint!T) { union FPInt { T f; ubyte[T.sizeof] a; } static FPInt fnan, fx; fx.f = f; return fnan.a == fx.a; } void main() { printf("%d\n", isInitNan(2.5)); float x; printf("%d\n", isInitNan(x)); x = 2.5; printf("%d\n", isInitNan(x)); }