extern void abort(); typedef union { struct { unsigned int hi; unsigned int lo; } i; double d; } hexdouble; static const double twoTo52 = 0x1.0p+52; void func ( double x ) { hexdouble argument; register double y, z; unsigned int xHead; argument.d = x; xHead = argument.i.hi & 0x7fffffff; if (__builtin_expect(!!(xHead < 0x43300000u), 1)) { y = ( x - twoTo52 ) + twoTo52; if ( y != x ) abort(); z = x - 0.5; y = ( z - twoTo52 ) + twoTo52; if ( y == (( x - twoTo52 ) + twoTo52) ) abort(); } return; } int main() { if (sizeof (double) == 4) return 0; func((double)1.00); return 0; }