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