xref: /inferno-os/libkern/nan-thumb.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
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.Forsyth NaN(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[0] = NANEXP;
17*37da2899SCharles.Forsyth 	a.x[1] = 1;
18*37da2899SCharles.Forsyth 	return a.d;
19*37da2899SCharles.Forsyth }
20*37da2899SCharles.Forsyth 
21*37da2899SCharles.Forsyth int
isNaN(double d)22*37da2899SCharles.Forsyth isNaN(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[0] & 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.Forsyth Inf(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[0] = NANEXP;
46*37da2899SCharles.Forsyth 	a.x[1] = 0;
47*37da2899SCharles.Forsyth 	if(sign < 0)
48*37da2899SCharles.Forsyth 		a.x[0] |= NANSIGN;
49*37da2899SCharles.Forsyth 	return a.d;
50*37da2899SCharles.Forsyth }
51*37da2899SCharles.Forsyth 
52*37da2899SCharles.Forsyth int
isInf(double d,int sign)53*37da2899SCharles.Forsyth isInf(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[1] != 0)
63*37da2899SCharles.Forsyth 		return 0;
64*37da2899SCharles.Forsyth 	if(a.x[0] == NANEXP)
65*37da2899SCharles.Forsyth 		return sign >= 0;
66*37da2899SCharles.Forsyth 	if(a.x[0] == (NANEXP|NANSIGN))
67*37da2899SCharles.Forsyth 		return sign <= 0;
68*37da2899SCharles.Forsyth 	return 0;
69*37da2899SCharles.Forsyth }
70