1 /* test cases for floating point comparison transformations 2 * compile with -DFLOAT_TYPE=float 3 * or -DFLOAT_TYPE=double 4 * or -DFLOAT_TYPE="long double" 5 */ 6 7 #include <assert.h> 8 #define _GNU_SOURCE 9 #include <math.h> /* for NaNs and infinity values */ 10 main()11int main() { 12 13 volatile FLOAT_TYPE a, b; 14 15 /* NaN */ 16 #ifdef NAN 17 a = (FLOAT_TYPE)NAN; /* produces NaN */ 18 #else 19 a = 0.0 / 0.0; /* produces NaN */ 20 #endif 21 #ifdef INFINITY 22 FLOAT_TYPE inf = (FLOAT_TYPE)INFINITY; 23 #else 24 FLOAT_TYPE inf = 1.0 / 0.0; /* produces infinity */ 25 #endif 26 FLOAT_TYPE negZero = 1.0 / -inf; 27 FLOAT_TYPE posZero = 0.0; 28 b = a; 29 30 assert(!(a < b)); 31 assert(!(a <= b)); 32 assert(!(a > b)); 33 assert(!(a >= b)); 34 assert((a != b)); 35 assert(!(a == b)); 36 37 b = 0.0; 38 assert(!(a < b)); 39 assert(!(a <= b)); 40 assert(!(a > b)); 41 assert(!(a >= b)); 42 assert((a != b)); 43 assert(!(a == b)); 44 45 b = 1.0 / -(1.0 / 0.0); /* negative 0 */ 46 assert(!(a < b)); 47 assert(!(a <= b)); 48 assert(!(a > b)); 49 assert(!(a >= b)); 50 assert((a != b)); 51 assert(!(a == b)); 52 53 b = 42.0; 54 assert(!(a < b)); 55 assert(!(a <= b)); 56 assert(!(a > b)); 57 assert(!(a >= b)); 58 assert((a != b)); 59 assert(!(a == b)); 60 61 b = -42.0; 62 assert(!(a < b)); 63 assert(!(a <= b)); 64 assert(!(a > b)); 65 assert(!(a >= b)); 66 assert((a != b)); 67 assert(!(a == b)); 68 69 b = (1.0 / 0.0); /* positive infinity */ 70 assert(!(a < b)); 71 assert(!(a <= b)); 72 assert(!(a > b)); 73 assert(!(a >= b)); 74 assert((a != b)); 75 assert(!(a == b)); 76 77 b = -(1.0 / 0.0); /* negative infinity */ 78 assert(!(a < b)); 79 assert(!(a <= b)); 80 assert(!(a > b)); 81 assert(!(a >= b)); 82 assert((a != b)); 83 assert(!(a == b)); 84 85 } 86 87