|
|
1.1 ! root 1: #ident "@(#)/usr/include/nan.h.sl 1.3 4.1 09/02/86 29438 AT&T-SF" ! 2: /* Handling of Not_a_Number's (only in IEEE floating-point standard) */ ! 3: #if _IEEE ! 4: typedef union ! 5: { ! 6: struct ! 7: { ! 8: unsigned sign : 1; ! 9: unsigned exponent :11; ! 10: unsigned bits:20; ! 11: unsigned fraction_low:32; ! 12: } inf_parts; ! 13: struct ! 14: { ! 15: unsigned sign : 1; ! 16: unsigned exponent :11; ! 17: unsigned qnan_bit : 1; ! 18: unsigned bits :19; ! 19: unsigned fraction_low: 32; ! 20: } nan_parts; ! 21: double d; ! 22: ! 23: } dnan; ! 24: ! 25: /* IsNANorINF checks that exponent of double == 2047 * ! 26: * i.e. that number is a NaN or an infinity */ ! 27: ! 28: #define IsNANorINF(X) (((dnan *)&(X))->nan_parts.exponent == 0x7ff) ! 29: ! 30: /* IsINF must be used after IsNANorINF * ! 31: * has checked the exponent */ ! 32: ! 33: #define IsINF(X) (((dnan *)&(X))->inf_parts.bits == 0 && \ ! 34: ((dnan *)&(X))->inf_parts.fraction_low == 0) ! 35: ! 36: /* IsPosNAN and IsNegNAN can be used * ! 37: * to check the sign of infinities too */ ! 38: ! 39: #define IsPosNAN(X) (((dnan *)&(X))->nan_parts.sign == 0) ! 40: ! 41: #define IsNegNAN(X) (((dnan *)&(X))->nan_parts.sign == 1) ! 42: ! 43: /* GETNaNPC gets the leftmost 32 bits * ! 44: * of the fraction part */ ! 45: ! 46: #define GETNaNPC(dval) (((dnan *)&(dval))->inf_parts.bits << 12 | \ ! 47: ((dnan *)&(dval))->nan_parts.fraction_low>> 20) ! 48: ! 49: #define KILLFPE() (void) kill(getpid(), 8) ! 50: #define NaN(X) (((dnan *)&(X))->nan_parts.exponent == 0x7ff) ! 51: #define KILLNaN(X) if (NaN(X)) KILLFPE() ! 52: ! 53: #else ! 54: ! 55: typedef double dnan; ! 56: #define IsINF(X) 0 ! 57: #define IsPINF(X) 0 ! 58: #define IsNegNAN(X) 0 ! 59: #define IsPosNAN(X) 0 ! 60: #define IsNAN(X) 0 ! 61: #define GETNaNPC(X) 0L ! 62: ! 63: #define NaN(X) 0 ! 64: #define KILLNaN(X) ! 65: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.