Mercurial > gnulib
annotate lib/ieee754.in.h @ 40186:8964917f9574
autoupdate
author | Karl Berry <karl@freefriends.org> |
---|---|
date | Mon, 18 Feb 2019 08:02:49 -0800 |
parents | b06060465f09 |
children |
rev | line source |
---|---|
40057
b06060465f09
maint: Run 'make update-copyright'
Paul Eggert <eggert@cs.ucla.edu>
parents:
39759
diff
changeset
|
1 /* Copyright (C) 1992-2019 Free Software Foundation, Inc. |
39759 | 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, see | |
16 <http://www.gnu.org/licenses/>. */ | |
17 | |
18 #ifndef _IEEE754_H | |
19 | |
20 #define _IEEE754_H 1 | |
21 | |
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 | |
48 | |
49 __BEGIN_DECLS | |
50 | |
51 union ieee754_float | |
52 { | |
53 float f; | |
54 | |
55 /* This is the IEEE 754 single-precision format. */ | |
56 struct | |
57 { | |
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; | |
69 | |
70 /* This format makes it easier to see if a NaN is a signalling NaN. */ | |
71 struct | |
72 { | |
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; | |
86 }; | |
87 | |
88 #define IEEE754_FLOAT_BIAS 0x7f /* Added to exponent. */ | |
89 | |
90 | |
91 union ieee754_double | |
92 { | |
93 double d; | |
94 | |
95 /* This is the IEEE 754 double-precision format. */ | |
96 struct | |
97 { | |
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; | |
120 | |
121 /* This format makes it easier to see if a NaN is a signalling NaN. */ | |
122 struct | |
123 { | |
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; | |
148 }; | |
149 | |
150 #define IEEE754_DOUBLE_BIAS 0x3ff /* Added to exponent. */ | |
151 | |
152 | |
153 union ieee854_long_double | |
154 { | |
155 long double d; | |
156 | |
157 /* This is the IEEE 854 double-extended-precision format. */ | |
158 struct | |
159 { | |
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; | |
183 | |
184 /* This is for NaNs in the IEEE 854 double-extended-precision format. */ | |
185 struct | |
186 { | |
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; | |
216 }; | |
217 | |
218 #define IEEE854_LONG_DOUBLE_BIAS 0x3fff | |
219 | |
220 __END_DECLS | |
221 | |
222 #endif /* ieee754.h */ |