|
|
1.1 root 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
9: NaN(void)
10: {
11: union
12: {
13: double d;
14: long x[2];
15: } a;
16:
17: a.x[0] = NANEXP;
18: a.x[1] = 1;
19: return a.d;
20: }
21:
22: int
23: isNaN(double d)
24: {
25: union
26: {
27: double d;
28: long x[2];
29: } a;
30:
31: a.d = d;
32: if((a.x[0] & NANMASK) != NANEXP)
33: return 0;
34: return !isInf(d, 0);
35: }
36:
37: double
38: Inf(int sign)
39: {
40: union
41: {
42: double d;
43: long x[2];
44: } a;
45:
46: a.x[0] = NANEXP;
47: a.x[1] = 0;
48: if(sign < 0)
49: a.x[0] |= NANSIGN;
50: return a.d;
51: }
52:
53: int
54: isInf(double d, int sign)
55: {
56: union
57: {
58: double d;
59: long x[2];
60: } a;
61:
62: a.d = d;
63: if(a.x[1] != 0)
64: return 0;
65: if(a.x[0] == NANEXP)
66: return sign >= 0;
67: if(a.x[0] == (NANEXP|NANSIGN))
68: return sign <= 0;
69: return 0;
70: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.