xref: /plan9/sys/src/libc/port/nan.c (revision 59cc4ca53493a3c6d2349fe2b7f7c40f7dce7294)
1*59cc4ca5SDavid du Colombier #include <u.h>
2*59cc4ca5SDavid du Colombier #include <libc.h>
3*59cc4ca5SDavid du Colombier 
4*59cc4ca5SDavid du Colombier #define	NANEXP	(2047<<20)
5*59cc4ca5SDavid du Colombier #define	NANMASK	(2047<<20)
6*59cc4ca5SDavid du Colombier #define	NANSIGN	(1<<31)
7*59cc4ca5SDavid du Colombier 
8*59cc4ca5SDavid du Colombier double
NaN(void)9*59cc4ca5SDavid du Colombier NaN(void)
10*59cc4ca5SDavid du Colombier {
11*59cc4ca5SDavid du Colombier 	FPdbleword a;
12*59cc4ca5SDavid du Colombier 
13*59cc4ca5SDavid du Colombier 	a.hi = NANEXP;
14*59cc4ca5SDavid du Colombier 	a.lo = 1;
15*59cc4ca5SDavid du Colombier 	return a.x;
16*59cc4ca5SDavid du Colombier }
17*59cc4ca5SDavid du Colombier 
18*59cc4ca5SDavid du Colombier int
isNaN(double d)19*59cc4ca5SDavid du Colombier isNaN(double d)
20*59cc4ca5SDavid du Colombier {
21*59cc4ca5SDavid du Colombier 	FPdbleword a;
22*59cc4ca5SDavid du Colombier 
23*59cc4ca5SDavid du Colombier 	a.x = d;
24*59cc4ca5SDavid du Colombier 	if((a.hi & NANMASK) != NANEXP)
25*59cc4ca5SDavid du Colombier 		return 0;
26*59cc4ca5SDavid du Colombier 	return !isInf(d, 0);
27*59cc4ca5SDavid du Colombier }
28*59cc4ca5SDavid du Colombier 
29*59cc4ca5SDavid du Colombier double
Inf(int sign)30*59cc4ca5SDavid du Colombier Inf(int sign)
31*59cc4ca5SDavid du Colombier {
32*59cc4ca5SDavid du Colombier 	FPdbleword a;
33*59cc4ca5SDavid du Colombier 
34*59cc4ca5SDavid du Colombier 	a.hi = NANEXP;
35*59cc4ca5SDavid du Colombier 	a.lo = 0;
36*59cc4ca5SDavid du Colombier 	if(sign < 0)
37*59cc4ca5SDavid du Colombier 		a.hi |= NANSIGN;
38*59cc4ca5SDavid du Colombier 	return a.x;
39*59cc4ca5SDavid du Colombier }
40*59cc4ca5SDavid du Colombier 
41*59cc4ca5SDavid du Colombier int
isInf(double d,int sign)42*59cc4ca5SDavid du Colombier isInf(double d, int sign)
43*59cc4ca5SDavid du Colombier {
44*59cc4ca5SDavid du Colombier 	FPdbleword a;
45*59cc4ca5SDavid du Colombier 
46*59cc4ca5SDavid du Colombier 	a.x = d;
47*59cc4ca5SDavid du Colombier 	if(a.lo != 0)
48*59cc4ca5SDavid du Colombier 		return 0;
49*59cc4ca5SDavid du Colombier 	if(a.hi == NANEXP)
50*59cc4ca5SDavid du Colombier 		return sign >= 0;
51*59cc4ca5SDavid du Colombier 	if(a.hi == (NANEXP|NANSIGN))
52*59cc4ca5SDavid du Colombier 		return sign <= 0;
53*59cc4ca5SDavid du Colombier 	return 0;
54*59cc4ca5SDavid du Colombier }
55