1 #include <lib9.h> 2 3 #define NANEXP (2047<<20) 4 #define NANMASK (2047<<20) 5 #define NANSIGN (1<<31) 6 7 double 8 NaN(void) 9 { 10 union 11 { 12 double d; 13 long x[2]; 14 } a; 15 16 a.x[1] = NANEXP; 17 a.x[0] = 1; 18 return a.d; 19 } 20 21 int 22 isNaN(double d) 23 { 24 union 25 { 26 double d; 27 long x[2]; 28 } a; 29 30 a.d = d; 31 if((a.x[1] & NANMASK) != NANEXP) 32 return 0; 33 return !isInf(d, 0); 34 } 35 36 double 37 Inf(int sign) 38 { 39 union 40 { 41 double d; 42 long x[2]; 43 } a; 44 45 a.x[1] = NANEXP; 46 a.x[0] = 0; 47 if(sign < 0) 48 a.x[1] |= NANSIGN; 49 return a.d; 50 } 51 52 int 53 isInf(double d, int sign) 54 { 55 union 56 { 57 double d; 58 long x[2]; 59 } a; 60 61 a.d = d; 62 if(a.x[0] != 0) 63 return 0; 64 if(a.x[1] == NANEXP) 65 return sign >= 0; 66 if(a.x[1] == (NANEXP|NANSIGN)) 67 return sign <= 0; 68 return 0; 69 } 70