#include #include typedef unsigned __int64 U64; U64 dblPatns[] = { 0x0000000000000000, // +zero 0x0000000000000001, // +denorm lo 0x000fffffffffffff, // +denorm hi 0x0010000000000000, // +norm lo 0x7fefffffffffffff, // +norm hi 0x7ff0000000000000, // +infinity 0x7ff0000000000001, // +sNAN lo 0x7ff7ffffffffffff, // +sNAN hi 0x7ff8000000000000, // +qNAN lo 0x7fffffffffffffff, // +qNAN hi 0x8000000000000000, // -zero 0x8000000000000001, // -denorm lo 0x800fffffffffffff, // -denorm hi 0x8010000000000000, // -norm lo 0xffefffffffffffff, // -norm hi 0xfff0000000000000, // -infinity 0xfff0000000000001, // -sNAN lo 0xfff7ffffffffffff, // -sNAN hi 0xfff8000000000000, // -IND ?? 0xfff8000000000001, // -qNAN lo 0xffffffffffffffff // -qNAN hi }; double asDouble( U64 u ) { return *(double*)&u; } char *FPClassAsText( int class ) { switch( class ) { case _FPCLASS_SNAN: return "Signaling NaN"; break; case _FPCLASS_QNAN: return "Quiet NaN"; break; case _FPCLASS_NINF: return "Negative infinity (–INF)"; break; case _FPCLASS_NN : return "Negative normalized non-zero"; break; case _FPCLASS_ND : return "Negative denormalized"; break; case _FPCLASS_NZ : return "Negative zero (-0)"; break; case _FPCLASS_PZ : return "Positive zero (+0)"; break; case _FPCLASS_PD : return "Positive denormalized"; break; case _FPCLASS_PN : return "Positive normalized non-zero"; break; case _FPCLASS_PINF: return "Positive infinity (+INF)"; break; default: return "Never happen; but silence the warning"; } } int main( int argc, char **argv ) { int i; for( i = 0; i < sizeof( dblPatns ) / sizeof( U64 ); ++i ) printf( "%016I64x : % 23.16g %s\n", dblPatns[ i ], asDouble( dblPatns[ i ] ), FPClassAsText( _fpclass( asDouble( dblPatns[ i ] ) ) ) ); }