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 3765283c 2003-11-25 devnull #ifdef __APPLE__
11 3765283c 2003-11-25 devnull #define _NEEDLL
12 3765283c 2003-11-25 devnull #endif
13 3765283c 2003-11-25 devnull
14 b2cfc4e2 2003-09-30 devnull typedef unsigned long long uvlong;
15 b2cfc4e2 2003-09-30 devnull typedef unsigned long ulong;
16 b2cfc4e2 2003-09-30 devnull
17 2db9e482 2003-11-24 devnull #ifdef _NEEDLL
18 b2cfc4e2 2003-09-30 devnull static uvlong uvnan = 0x7FF0000000000001LL;
19 b2cfc4e2 2003-09-30 devnull static uvlong uvinf = 0x7FF0000000000000LL;
20 b2cfc4e2 2003-09-30 devnull static uvlong uvneginf = 0xFFF0000000000000LL;
21 b2cfc4e2 2003-09-30 devnull #else
22 b2cfc4e2 2003-09-30 devnull static uvlong uvnan = 0x7FF0000000000001;
23 b2cfc4e2 2003-09-30 devnull static uvlong uvinf = 0x7FF0000000000000;
24 b2cfc4e2 2003-09-30 devnull static uvlong uvneginf = 0xFFF0000000000000;
25 b2cfc4e2 2003-09-30 devnull #endif
26 b2cfc4e2 2003-09-30 devnull
27 b2cfc4e2 2003-09-30 devnull double
28 b2cfc4e2 2003-09-30 devnull __NaN(void)
29 b2cfc4e2 2003-09-30 devnull {
30 b2cfc4e2 2003-09-30 devnull uvlong *p;
31 b2cfc4e2 2003-09-30 devnull
32 b2cfc4e2 2003-09-30 devnull /* gcc complains about "return *(double*)&uvnan;" */
33 b2cfc4e2 2003-09-30 devnull p = &uvnan;
34 b2cfc4e2 2003-09-30 devnull return *(double*)p;
35 b2cfc4e2 2003-09-30 devnull }
36 b2cfc4e2 2003-09-30 devnull
37 b2cfc4e2 2003-09-30 devnull int
38 b2cfc4e2 2003-09-30 devnull __isNaN(double d)
39 b2cfc4e2 2003-09-30 devnull {
40 b2cfc4e2 2003-09-30 devnull uvlong x;
41 b2cfc4e2 2003-09-30 devnull double *p;
42 b2cfc4e2 2003-09-30 devnull
43 b2cfc4e2 2003-09-30 devnull p = &d;
44 b2cfc4e2 2003-09-30 devnull x = *(uvlong*)p;
45 b2cfc4e2 2003-09-30 devnull return (ulong)(x>>32)==0x7FF00000 && !__isInf(d, 0);
46 b2cfc4e2 2003-09-30 devnull }
47 b2cfc4e2 2003-09-30 devnull
48 b2cfc4e2 2003-09-30 devnull double
49 b2cfc4e2 2003-09-30 devnull __Inf(int sign)
50 b2cfc4e2 2003-09-30 devnull {
51 b2cfc4e2 2003-09-30 devnull uvlong *p;
52 b2cfc4e2 2003-09-30 devnull
53 b2cfc4e2 2003-09-30 devnull if(sign < 0)
54 b2cfc4e2 2003-09-30 devnull p = &uvinf;
55 b2cfc4e2 2003-09-30 devnull else
56 b2cfc4e2 2003-09-30 devnull p = &uvneginf;
57 b2cfc4e2 2003-09-30 devnull return *(double*)p;
58 b2cfc4e2 2003-09-30 devnull }
59 b2cfc4e2 2003-09-30 devnull
60 b2cfc4e2 2003-09-30 devnull int
61 b2cfc4e2 2003-09-30 devnull __isInf(double d, int sign)
62 b2cfc4e2 2003-09-30 devnull {
63 b2cfc4e2 2003-09-30 devnull uvlong x;
64 b2cfc4e2 2003-09-30 devnull double *p;
65 b2cfc4e2 2003-09-30 devnull
66 b2cfc4e2 2003-09-30 devnull p = &d;
67 b2cfc4e2 2003-09-30 devnull x = *(uvlong*)p;
68 b2cfc4e2 2003-09-30 devnull if(sign == 0)
69 b2cfc4e2 2003-09-30 devnull return x==uvinf || x==uvneginf;
70 b2cfc4e2 2003-09-30 devnull else if(sign > 0)
71 b2cfc4e2 2003-09-30 devnull return x==uvinf;
72 b2cfc4e2 2003-09-30 devnull else
73 b2cfc4e2 2003-09-30 devnull return x==uvneginf;
74 b2cfc4e2 2003-09-30 devnull }
75 b2cfc4e2 2003-09-30 devnull
76 b2cfc4e2 2003-09-30 devnull