Blame


1 d19fdc05 2009-08-15 rsc /* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */
2 d19fdc05 2009-08-15 rsc
3 91c13e54 2004-02-29 devnull /*
4 91c13e54 2004-02-29 devnull * 64-bit IEEE not-a-number routines.
5 91c13e54 2004-02-29 devnull * This is big/little-endian portable assuming that
6 91c13e54 2004-02-29 devnull * the 64-bit doubles and 64-bit integers have the
7 91c13e54 2004-02-29 devnull * same byte ordering.
8 91c13e54 2004-02-29 devnull */
9 91c13e54 2004-02-29 devnull
10 e5aa96ac 2004-12-26 devnull #include "plan9.h"
11 66f6e2b6 2008-05-10 rsc #include <assert.h>
12 e5aa96ac 2004-12-26 devnull #include "fmt.h"
13 e5aa96ac 2004-12-26 devnull #include "fmtdef.h"
14 91c13e54 2004-02-29 devnull
15 040d1d02 2004-09-23 devnull static uvlong uvnan = ((uvlong)0x7FF00000<<32)|0x00000001;
16 040d1d02 2004-09-23 devnull static uvlong uvinf = ((uvlong)0x7FF00000<<32)|0x00000000;
17 040d1d02 2004-09-23 devnull static uvlong uvneginf = ((uvlong)0xFFF00000<<32)|0x00000000;
18 91c13e54 2004-02-29 devnull
19 66f6e2b6 2008-05-10 rsc /* gcc sees through the obvious casts. */
20 66f6e2b6 2008-05-10 rsc static uvlong
21 66f6e2b6 2008-05-10 rsc d2u(double d)
22 66f6e2b6 2008-05-10 rsc {
23 66f6e2b6 2008-05-10 rsc union {
24 66f6e2b6 2008-05-10 rsc uvlong v;
25 66f6e2b6 2008-05-10 rsc double d;
26 66f6e2b6 2008-05-10 rsc } u;
27 66f6e2b6 2008-05-10 rsc assert(sizeof(u.d) == sizeof(u.v));
28 66f6e2b6 2008-05-10 rsc u.d = d;
29 66f6e2b6 2008-05-10 rsc return u.v;
30 66f6e2b6 2008-05-10 rsc }
31 66f6e2b6 2008-05-10 rsc
32 66f6e2b6 2008-05-10 rsc static double
33 66f6e2b6 2008-05-10 rsc u2d(uvlong v)
34 66f6e2b6 2008-05-10 rsc {
35 66f6e2b6 2008-05-10 rsc union {
36 66f6e2b6 2008-05-10 rsc uvlong v;
37 66f6e2b6 2008-05-10 rsc double d;
38 66f6e2b6 2008-05-10 rsc } u;
39 66f6e2b6 2008-05-10 rsc assert(sizeof(u.d) == sizeof(u.v));
40 66f6e2b6 2008-05-10 rsc u.v = v;
41 66f6e2b6 2008-05-10 rsc return u.d;
42 66f6e2b6 2008-05-10 rsc }
43 66f6e2b6 2008-05-10 rsc
44 91c13e54 2004-02-29 devnull double
45 91c13e54 2004-02-29 devnull __NaN(void)
46 91c13e54 2004-02-29 devnull {
47 66f6e2b6 2008-05-10 rsc return u2d(uvnan);
48 91c13e54 2004-02-29 devnull }
49 91c13e54 2004-02-29 devnull
50 91c13e54 2004-02-29 devnull int
51 91c13e54 2004-02-29 devnull __isNaN(double d)
52 91c13e54 2004-02-29 devnull {
53 91c13e54 2004-02-29 devnull uvlong x;
54 35920e96 2007-05-10 devnull
55 66f6e2b6 2008-05-10 rsc x = d2u(d);
56 ada7ea05 2007-04-06 devnull /* IEEE 754: exponent bits 0x7FF and non-zero mantissa */
57 ada7ea05 2007-04-06 devnull return (x&uvinf) == uvinf && (x&~uvneginf) != 0;
58 91c13e54 2004-02-29 devnull }
59 91c13e54 2004-02-29 devnull
60 91c13e54 2004-02-29 devnull double
61 91c13e54 2004-02-29 devnull __Inf(int sign)
62 91c13e54 2004-02-29 devnull {
63 66f6e2b6 2008-05-10 rsc return u2d(sign < 0 ? uvneginf : uvinf);
64 91c13e54 2004-02-29 devnull }
65 91c13e54 2004-02-29 devnull
66 91c13e54 2004-02-29 devnull int
67 91c13e54 2004-02-29 devnull __isInf(double d, int sign)
68 91c13e54 2004-02-29 devnull {
69 91c13e54 2004-02-29 devnull uvlong x;
70 66f6e2b6 2008-05-10 rsc
71 66f6e2b6 2008-05-10 rsc x = d2u(d);
72 91c13e54 2004-02-29 devnull if(sign == 0)
73 91c13e54 2004-02-29 devnull return x==uvinf || x==uvneginf;
74 91c13e54 2004-02-29 devnull else if(sign > 0)
75 91c13e54 2004-02-29 devnull return x==uvinf;
76 91c13e54 2004-02-29 devnull else
77 91c13e54 2004-02-29 devnull return x==uvneginf;
78 91c13e54 2004-02-29 devnull }