Blame


1 b2cfc4e2 2003-09-30 devnull /*
2 b2cfc4e2 2003-09-30 devnull * 64-bit IEEE not-a-number routines.
3 b2cfc4e2 2003-09-30 devnull * This is big/little-endian portable assuming that
4 b2cfc4e2 2003-09-30 devnull * the 64-bit doubles and 64-bit integers have the
5 b2cfc4e2 2003-09-30 devnull * same byte ordering.
6 b2cfc4e2 2003-09-30 devnull */
7 b2cfc4e2 2003-09-30 devnull
8 b2cfc4e2 2003-09-30 devnull #include "nan.h"
9 b2cfc4e2 2003-09-30 devnull
10 b2cfc4e2 2003-09-30 devnull typedef unsigned long long uvlong;
11 b2cfc4e2 2003-09-30 devnull typedef unsigned long ulong;
12 b2cfc4e2 2003-09-30 devnull
13 b2cfc4e2 2003-09-30 devnull #ifdef NEEDLL
14 b2cfc4e2 2003-09-30 devnull static uvlong uvnan = 0x7FF0000000000001LL;
15 b2cfc4e2 2003-09-30 devnull static uvlong uvinf = 0x7FF0000000000000LL;
16 b2cfc4e2 2003-09-30 devnull static uvlong uvneginf = 0xFFF0000000000000LL;
17 b2cfc4e2 2003-09-30 devnull #else
18 b2cfc4e2 2003-09-30 devnull static uvlong uvnan = 0x7FF0000000000001;
19 b2cfc4e2 2003-09-30 devnull static uvlong uvinf = 0x7FF0000000000000;
20 b2cfc4e2 2003-09-30 devnull static uvlong uvneginf = 0xFFF0000000000000;
21 b2cfc4e2 2003-09-30 devnull #endif
22 b2cfc4e2 2003-09-30 devnull
23 b2cfc4e2 2003-09-30 devnull double
24 b2cfc4e2 2003-09-30 devnull __NaN(void)
25 b2cfc4e2 2003-09-30 devnull {
26 b2cfc4e2 2003-09-30 devnull uvlong *p;
27 b2cfc4e2 2003-09-30 devnull
28 b2cfc4e2 2003-09-30 devnull /* gcc complains about "return *(double*)&uvnan;" */
29 b2cfc4e2 2003-09-30 devnull p = &uvnan;
30 b2cfc4e2 2003-09-30 devnull return *(double*)p;
31 b2cfc4e2 2003-09-30 devnull }
32 b2cfc4e2 2003-09-30 devnull
33 b2cfc4e2 2003-09-30 devnull int
34 b2cfc4e2 2003-09-30 devnull __isNaN(double d)
35 b2cfc4e2 2003-09-30 devnull {
36 b2cfc4e2 2003-09-30 devnull uvlong x;
37 b2cfc4e2 2003-09-30 devnull double *p;
38 b2cfc4e2 2003-09-30 devnull
39 b2cfc4e2 2003-09-30 devnull p = &d;
40 b2cfc4e2 2003-09-30 devnull x = *(uvlong*)p;
41 b2cfc4e2 2003-09-30 devnull return (ulong)(x>>32)==0x7FF00000 && !__isInf(d, 0);
42 b2cfc4e2 2003-09-30 devnull }
43 b2cfc4e2 2003-09-30 devnull
44 b2cfc4e2 2003-09-30 devnull double
45 b2cfc4e2 2003-09-30 devnull __Inf(int sign)
46 b2cfc4e2 2003-09-30 devnull {
47 b2cfc4e2 2003-09-30 devnull uvlong *p;
48 b2cfc4e2 2003-09-30 devnull
49 b2cfc4e2 2003-09-30 devnull if(sign < 0)
50 b2cfc4e2 2003-09-30 devnull p = &uvinf;
51 b2cfc4e2 2003-09-30 devnull else
52 b2cfc4e2 2003-09-30 devnull p = &uvneginf;
53 b2cfc4e2 2003-09-30 devnull return *(double*)p;
54 b2cfc4e2 2003-09-30 devnull }
55 b2cfc4e2 2003-09-30 devnull
56 b2cfc4e2 2003-09-30 devnull int
57 b2cfc4e2 2003-09-30 devnull __isInf(double d, int sign)
58 b2cfc4e2 2003-09-30 devnull {
59 b2cfc4e2 2003-09-30 devnull uvlong x;
60 b2cfc4e2 2003-09-30 devnull double *p;
61 b2cfc4e2 2003-09-30 devnull
62 b2cfc4e2 2003-09-30 devnull p = &d;
63 b2cfc4e2 2003-09-30 devnull x = *(uvlong*)p;
64 b2cfc4e2 2003-09-30 devnull if(sign == 0)
65 b2cfc4e2 2003-09-30 devnull return x==uvinf || x==uvneginf;
66 b2cfc4e2 2003-09-30 devnull else if(sign > 0)
67 b2cfc4e2 2003-09-30 devnull return x==uvinf;
68 b2cfc4e2 2003-09-30 devnull else
69 b2cfc4e2 2003-09-30 devnull return x==uvneginf;
70 b2cfc4e2 2003-09-30 devnull }
71 b2cfc4e2 2003-09-30 devnull
72 b2cfc4e2 2003-09-30 devnull