Blame


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