1*8ccd4a63SDavid du Colombier /* 2*8ccd4a63SDavid du Colombier * 64-bit IEEE not-a-number routines. 3*8ccd4a63SDavid du Colombier * This is big/little-endian portable assuming that 4*8ccd4a63SDavid du Colombier * the 64-bit doubles and 64-bit integers have the 5*8ccd4a63SDavid du Colombier * same byte ordering. 6*8ccd4a63SDavid du Colombier */ 7*8ccd4a63SDavid du Colombier 8*8ccd4a63SDavid du Colombier #include <u.h> 9*8ccd4a63SDavid du Colombier #include <libc.h> 10*8ccd4a63SDavid du Colombier #include "nan.h" 11*8ccd4a63SDavid du Colombier 12*8ccd4a63SDavid du Colombier // typedef unsigned long long uvlong; 13*8ccd4a63SDavid du Colombier // typedef unsigned long ulong; 14*8ccd4a63SDavid du Colombier 15*8ccd4a63SDavid du Colombier static uvlong uvnan = 0x7FF0000000000001ULL; 16*8ccd4a63SDavid du Colombier static uvlong uvinf = 0x7FF0000000000000ULL; 17*8ccd4a63SDavid du Colombier static uvlong uvneginf = 0xFFF0000000000000ULL; 18*8ccd4a63SDavid du Colombier 19*8ccd4a63SDavid du Colombier double 20*8ccd4a63SDavid du Colombier __NaN(void) 21*8ccd4a63SDavid du Colombier { 22*8ccd4a63SDavid du Colombier return *(double*)(void*)&uvnan; 23*8ccd4a63SDavid du Colombier } 24*8ccd4a63SDavid du Colombier 25*8ccd4a63SDavid du Colombier int 26*8ccd4a63SDavid du Colombier __isNaN(double d) 27*8ccd4a63SDavid du Colombier { 28*8ccd4a63SDavid du Colombier uvlong x = *(uvlong*)(void*)&d; 29*8ccd4a63SDavid du Colombier return (ulong)(x>>32)==0x7FF00000 && !__isInf(d, 0); 30*8ccd4a63SDavid du Colombier } 31*8ccd4a63SDavid du Colombier 32*8ccd4a63SDavid du Colombier double 33*8ccd4a63SDavid du Colombier __Inf(int sign) 34*8ccd4a63SDavid du Colombier { 35*8ccd4a63SDavid du Colombier if(sign < 0) 36*8ccd4a63SDavid du Colombier return *(double*)(void*)&uvinf; 37*8ccd4a63SDavid du Colombier else 38*8ccd4a63SDavid du Colombier return *(double*)(void*)&uvneginf; 39*8ccd4a63SDavid du Colombier } 40*8ccd4a63SDavid du Colombier 41*8ccd4a63SDavid du Colombier int 42*8ccd4a63SDavid du Colombier __isInf(double d, int sign) 43*8ccd4a63SDavid du Colombier { 44*8ccd4a63SDavid du Colombier uvlong x; 45*8ccd4a63SDavid du Colombier 46*8ccd4a63SDavid du Colombier x = *(uvlong*)(void*)&d; 47*8ccd4a63SDavid du Colombier if(sign == 0) 48*8ccd4a63SDavid du Colombier return x==uvinf || x==uvneginf; 49*8ccd4a63SDavid du Colombier else if(sign > 0) 50*8ccd4a63SDavid du Colombier return x==uvinf; 51*8ccd4a63SDavid du Colombier else 52*8ccd4a63SDavid du Colombier return x==uvneginf; 53*8ccd4a63SDavid du Colombier } 54*8ccd4a63SDavid du Colombier 55*8ccd4a63SDavid du Colombier 56