xref: /haiku/src/system/libroot/posix/glibc/include/ieee754.h (revision ed24eb5ff12640d052171c6a7feba37fab8a75d1)
1 /* Copyright (C) 1992, 1995, 1996, 1999 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3 
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8 
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13 
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, write to the Free
16    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17    02111-1307 USA.  */
18 
19 #ifndef _IEEE754_H
20 
21 #define _IEEE754_H 1
22 #include <features.h>
23 
24 #include <endian.h>
25 
26 __BEGIN_DECLS
27 
28 union ieee754_float
29   {
30     float f;
31 
32     /* This is the IEEE 754 single-precision format.  */
33     struct
34       {
35 #if	__BYTE_ORDER == __BIG_ENDIAN
36 	unsigned int negative:1;
37 	unsigned int exponent:8;
38 	unsigned int mantissa:23;
39 #endif				/* Big endian.  */
40 #if	__BYTE_ORDER == __LITTLE_ENDIAN
41 	unsigned int mantissa:23;
42 	unsigned int exponent:8;
43 	unsigned int negative:1;
44 #endif				/* Little endian.  */
45       } ieee;
46 
47     /* This format makes it easier to see if a NaN is a signalling NaN.  */
48     struct
49       {
50 #if	__BYTE_ORDER == __BIG_ENDIAN
51 	unsigned int negative:1;
52 	unsigned int exponent:8;
53 	unsigned int quiet_nan:1;
54 	unsigned int mantissa:22;
55 #endif				/* Big endian.  */
56 #if	__BYTE_ORDER == __LITTLE_ENDIAN
57 	unsigned int mantissa:22;
58 	unsigned int quiet_nan:1;
59 	unsigned int exponent:8;
60 	unsigned int negative:1;
61 #endif				/* Little endian.  */
62       } ieee_nan;
63   };
64 
65 #define IEEE754_FLOAT_BIAS	0x7f /* Added to exponent.  */
66 
67 
68 union ieee754_double
69   {
70     double d;
71 
72     /* This is the IEEE 754 double-precision format.  */
73     struct
74       {
75 #if	__BYTE_ORDER == __BIG_ENDIAN
76 	unsigned int negative:1;
77 	unsigned int exponent:11;
78 	/* Together these comprise the mantissa.  */
79 	unsigned int mantissa0:20;
80 	unsigned int mantissa1:32;
81 #endif				/* Big endian.  */
82 #if	__BYTE_ORDER == __LITTLE_ENDIAN
83 # if	__FLOAT_WORD_ORDER == BIG_ENDIAN
84 	unsigned int mantissa0:20;
85 	unsigned int exponent:11;
86 	unsigned int negative:1;
87 	unsigned int mantissa1:32;
88 # else
89 	/* Together these comprise the mantissa.  */
90 	unsigned int mantissa1:32;
91 	unsigned int mantissa0:20;
92 	unsigned int exponent:11;
93 	unsigned int negative:1;
94 # endif
95 #endif				/* Little endian.  */
96       } ieee;
97 
98     /* This format makes it easier to see if a NaN is a signalling NaN.  */
99     struct
100       {
101 #if	__BYTE_ORDER == __BIG_ENDIAN
102 	unsigned int negative:1;
103 	unsigned int exponent:11;
104 	unsigned int quiet_nan:1;
105 	/* Together these comprise the mantissa.  */
106 	unsigned int mantissa0:19;
107 	unsigned int mantissa1:32;
108 #else
109 # if	__FLOAT_WORD_ORDER == BIG_ENDIAN
110 	unsigned int mantissa0:19;
111 	unsigned int quiet_nan:1;
112 	unsigned int exponent:11;
113 	unsigned int negative:1;
114 	unsigned int mantissa1:32;
115 # else
116 	/* Together these comprise the mantissa.  */
117 	unsigned int mantissa1:32;
118 	unsigned int mantissa0:19;
119 	unsigned int quiet_nan:1;
120 	unsigned int exponent:11;
121 	unsigned int negative:1;
122 # endif
123 #endif
124       } ieee_nan;
125   };
126 
127 #define IEEE754_DOUBLE_BIAS	0x3ff /* Added to exponent.  */
128 
129 
130 union ieee854_long_double
131   {
132     long double d;
133 
134     /* This is the IEEE 854 double-extended-precision format.  */
135     struct
136       {
137 #if	__BYTE_ORDER == __BIG_ENDIAN
138 	unsigned int negative:1;
139 	unsigned int exponent:15;
140 	unsigned int empty:16;
141 	unsigned int mantissa0:32;
142 	unsigned int mantissa1:32;
143 #endif
144 #if	__BYTE_ORDER == __LITTLE_ENDIAN
145 # if	__FLOAT_WORD_ORDER == BIG_ENDIAN
146 	unsigned int exponent:15;
147 	unsigned int negative:1;
148 	unsigned int empty:16;
149 	unsigned int mantissa0:32;
150 	unsigned int mantissa1:32;
151 # else
152 	unsigned int mantissa1:32;
153 	unsigned int mantissa0:32;
154 	unsigned int exponent:15;
155 	unsigned int negative:1;
156 	unsigned int empty:16;
157 # endif
158 #endif
159       } ieee;
160 
161     /* This is for NaNs in the IEEE 854 double-extended-precision format.  */
162     struct
163       {
164 #if	__BYTE_ORDER == __BIG_ENDIAN
165 	unsigned int negative:1;
166 	unsigned int exponent:15;
167 	unsigned int empty:16;
168 	unsigned int one:1;
169 	unsigned int quiet_nan:1;
170 	unsigned int mantissa0:30;
171 	unsigned int mantissa1:32;
172 #endif
173 #if	__BYTE_ORDER == __LITTLE_ENDIAN
174 # if	__FLOAT_WORD_ORDER == BIG_ENDIAN
175 	unsigned int exponent:15;
176 	unsigned int negative:1;
177 	unsigned int empty:16;
178 	unsigned int mantissa0:30;
179 	unsigned int quiet_nan:1;
180 	unsigned int one:1;
181 	unsigned int mantissa1:32;
182 # else
183 	unsigned int mantissa1:32;
184 	unsigned int mantissa0:30;
185 	unsigned int quiet_nan:1;
186 	unsigned int one:1;
187 	unsigned int exponent:15;
188 	unsigned int negative:1;
189 	unsigned int empty:16;
190 # endif
191 #endif
192       } ieee_nan;
193   };
194 
195 #define IEEE854_LONG_DOUBLE_BIAS 0x3fff
196 
197 __END_DECLS
198 
199 #endif /* ieee754.h */
200