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