exp2l: Work around a NetBSD 10.0/i386 bug.
[gnulib.git] / lib / ieee754.in.h
blob805048ca9fc4c88d3ec8e6ebac802afb54c88bed
1 /* Copyright (C) 1992-2024 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
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.
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.
14 You should have received a copy of the GNU Lesser General Public
15 License along with the GNU C Library; if not, see
16 <https://www.gnu.org/licenses/>. */
18 #ifndef _IEEE754_H
20 #define _IEEE754_H 1
22 #ifndef _GL_GNULIB_HEADER
23 /* Ordinary glibc usage. */
24 # include <features.h>
25 # include <endian.h>
26 #else
27 /* Gnulib usage. */
28 # ifndef __BEGIN_DECLS
29 # ifdef __cplusplus
30 # define __BEGIN_DECLS extern "C" {
31 # define __END_DECLS }
32 # else
33 # define __BEGIN_DECLS
34 # define __END_DECLS
35 # endif
36 # endif
37 # ifndef __FLOAT_WORD_ORDER
38 # define __LITTLE_ENDIAN 1234
39 # define __BIG_ENDIAN 4321
40 # ifdef WORDS_BIGENDIAN
41 # define __BYTE_ORDER __BIG_ENDIAN
42 # else
43 # define __BYTE_ORDER __LITTLE_ENDIAN
44 # endif
45 # define __FLOAT_WORD_ORDER __BYTE_ORDER
46 # endif
47 #endif
49 __BEGIN_DECLS
51 union ieee754_float
53 float f;
55 /* This is the IEEE 754 single-precision format. */
56 struct
58 #if __BYTE_ORDER == __BIG_ENDIAN
59 unsigned int negative:1;
60 unsigned int exponent:8;
61 unsigned int mantissa:23;
62 #endif /* Big endian. */
63 #if __BYTE_ORDER == __LITTLE_ENDIAN
64 unsigned int mantissa:23;
65 unsigned int exponent:8;
66 unsigned int negative:1;
67 #endif /* Little endian. */
68 } ieee;
70 /* This format makes it easier to see if a NaN is a signalling NaN. */
71 struct
73 #if __BYTE_ORDER == __BIG_ENDIAN
74 unsigned int negative:1;
75 unsigned int exponent:8;
76 unsigned int quiet_nan:1;
77 unsigned int mantissa:22;
78 #endif /* Big endian. */
79 #if __BYTE_ORDER == __LITTLE_ENDIAN
80 unsigned int mantissa:22;
81 unsigned int quiet_nan:1;
82 unsigned int exponent:8;
83 unsigned int negative:1;
84 #endif /* Little endian. */
85 } ieee_nan;
88 #define IEEE754_FLOAT_BIAS 0x7f /* Added to exponent. */
91 union ieee754_double
93 double d;
95 /* This is the IEEE 754 double-precision format. */
96 struct
98 #if __BYTE_ORDER == __BIG_ENDIAN
99 unsigned int negative:1;
100 unsigned int exponent:11;
101 /* Together these comprise the mantissa. */
102 unsigned int mantissa0:20;
103 unsigned int mantissa1:32;
104 #endif /* Big endian. */
105 #if __BYTE_ORDER == __LITTLE_ENDIAN
106 # if __FLOAT_WORD_ORDER == __BIG_ENDIAN
107 unsigned int mantissa0:20;
108 unsigned int exponent:11;
109 unsigned int negative:1;
110 unsigned int mantissa1:32;
111 # else
112 /* Together these comprise the mantissa. */
113 unsigned int mantissa1:32;
114 unsigned int mantissa0:20;
115 unsigned int exponent:11;
116 unsigned int negative:1;
117 # endif
118 #endif /* Little endian. */
119 } ieee;
121 /* This format makes it easier to see if a NaN is a signalling NaN. */
122 struct
124 #if __BYTE_ORDER == __BIG_ENDIAN
125 unsigned int negative:1;
126 unsigned int exponent:11;
127 unsigned int quiet_nan:1;
128 /* Together these comprise the mantissa. */
129 unsigned int mantissa0:19;
130 unsigned int mantissa1:32;
131 #else
132 # if __FLOAT_WORD_ORDER == __BIG_ENDIAN
133 unsigned int mantissa0:19;
134 unsigned int quiet_nan:1;
135 unsigned int exponent:11;
136 unsigned int negative:1;
137 unsigned int mantissa1:32;
138 # else
139 /* Together these comprise the mantissa. */
140 unsigned int mantissa1:32;
141 unsigned int mantissa0:19;
142 unsigned int quiet_nan:1;
143 unsigned int exponent:11;
144 unsigned int negative:1;
145 # endif
146 #endif
147 } ieee_nan;
150 #define IEEE754_DOUBLE_BIAS 0x3ff /* Added to exponent. */
153 union ieee854_long_double
155 long double d;
157 /* This is the IEEE 854 double-extended-precision format. */
158 struct
160 #if __BYTE_ORDER == __BIG_ENDIAN
161 unsigned int negative:1;
162 unsigned int exponent:15;
163 unsigned int empty:16;
164 unsigned int mantissa0:32;
165 unsigned int mantissa1:32;
166 #endif
167 #if __BYTE_ORDER == __LITTLE_ENDIAN
168 # if __FLOAT_WORD_ORDER == __BIG_ENDIAN
169 unsigned int exponent:15;
170 unsigned int negative:1;
171 unsigned int empty:16;
172 unsigned int mantissa0:32;
173 unsigned int mantissa1:32;
174 # else
175 unsigned int mantissa1:32;
176 unsigned int mantissa0:32;
177 unsigned int exponent:15;
178 unsigned int negative:1;
179 unsigned int empty:16;
180 # endif
181 #endif
182 } ieee;
184 /* This is for NaNs in the IEEE 854 double-extended-precision format. */
185 struct
187 #if __BYTE_ORDER == __BIG_ENDIAN
188 unsigned int negative:1;
189 unsigned int exponent:15;
190 unsigned int empty:16;
191 unsigned int one:1;
192 unsigned int quiet_nan:1;
193 unsigned int mantissa0:30;
194 unsigned int mantissa1:32;
195 #endif
196 #if __BYTE_ORDER == __LITTLE_ENDIAN
197 # if __FLOAT_WORD_ORDER == __BIG_ENDIAN
198 unsigned int exponent:15;
199 unsigned int negative:1;
200 unsigned int empty:16;
201 unsigned int mantissa0:30;
202 unsigned int quiet_nan:1;
203 unsigned int one:1;
204 unsigned int mantissa1:32;
205 # else
206 unsigned int mantissa1:32;
207 unsigned int mantissa0:30;
208 unsigned int quiet_nan:1;
209 unsigned int one:1;
210 unsigned int exponent:15;
211 unsigned int negative:1;
212 unsigned int empty:16;
213 # endif
214 #endif
215 } ieee_nan;
218 #define IEEE854_LONG_DOUBLE_BIAS 0x3fff
220 __END_DECLS
222 #endif /* ieee754.h */