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