#include #include double nan = 1.0/0.0 - 1.0/0.0; double x = 1.0; void leave () { printf ("Leaving...\n"); exit (0); } main () { // fesetenv(FE_DFL_ENV); #if ! defined (__vax__) && ! defined (_CRAY) /* Move this line earlier, for architectures (like alpha) that issue SIGFPE on the first comparisons. */ #ifndef SIGNAL_SUPPRESS /* Some machines catches a SIGFPE when a NaN is compared. Let this test succeed o such machines. */ signal (SIGFPE, leave); #endif /* NaN is an IEEE unordered operand. All these test should be false. */ if (nan == nan) { printf ("Oops: nan == nan comparison failed.\n"); abort (); } if (nan != x) x = 1.0; else { printf ("Oops: nan != x comparison failed.\n"); abort (); } if (nan < x) { printf ("Oops: nan < x comparison failed.\n"); abort (); } if (nan > x) { printf ("Oops: nan > x comparison failed.\n"); abort (); } __asm__ ("@ Scott: nan <= x comparison test."); if (nan <= x) { printf ("Oops: nan <= x comparison failed.\n"); abort (); } if (nan >= x) { printf ("Oops: nan >= x comparison failed.\n"); abort (); } if (nan == x) { printf ("Oops: nan == x comparison failed.\n"); abort (); } #endif exit (0); }