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