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)); }