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