master
  1/* Copyright (C) 1992-2025 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, see
 16   <https://www.gnu.org/licenses/>.  */
 17
 18#ifndef _IEEE754_H
 19#define _IEEE754_H 1
 20
 21#include <features.h>
 22
 23#include <bits/endian.h>
 24
 25#ifndef __LDBL_MANT_DIG__
 26# include <float.h>
 27# define __LDBL_MANT_DIG__ LDBL_MANT_DIG
 28#endif
 29
 30__BEGIN_DECLS
 31
 32union ieee754_float
 33  {
 34    float f;
 35
 36    /* This is the IEEE 754 single-precision format.  */
 37    struct
 38      {
 39#if	__BYTE_ORDER == __BIG_ENDIAN
 40	unsigned int negative:1;
 41	unsigned int exponent:8;
 42	unsigned int mantissa:23;
 43#endif				/* Big endian.  */
 44#if	__BYTE_ORDER == __LITTLE_ENDIAN
 45	unsigned int mantissa:23;
 46	unsigned int exponent:8;
 47	unsigned int negative:1;
 48#endif				/* Little endian.  */
 49      } ieee;
 50
 51    /* This format makes it easier to see if a NaN is a signalling NaN.  */
 52    struct
 53      {
 54#if	__BYTE_ORDER == __BIG_ENDIAN
 55	unsigned int negative:1;
 56	unsigned int exponent:8;
 57	unsigned int quiet_nan:1;
 58	unsigned int mantissa:22;
 59#endif				/* Big endian.  */
 60#if	__BYTE_ORDER == __LITTLE_ENDIAN
 61	unsigned int mantissa:22;
 62	unsigned int quiet_nan:1;
 63	unsigned int exponent:8;
 64	unsigned int negative:1;
 65#endif				/* Little endian.  */
 66      } ieee_nan;
 67  };
 68
 69#define IEEE754_FLOAT_BIAS	0x7f /* Added to exponent.  */
 70
 71
 72union ieee754_double
 73  {
 74    double d;
 75
 76    /* This is the IEEE 754 double-precision format.  */
 77    struct
 78      {
 79#if	__BYTE_ORDER == __BIG_ENDIAN
 80	unsigned int negative:1;
 81	unsigned int exponent:11;
 82	/* Together these comprise the mantissa.  */
 83	unsigned int mantissa0:20;
 84	unsigned int mantissa1:32;
 85#endif				/* Big endian.  */
 86#if	__BYTE_ORDER == __LITTLE_ENDIAN
 87# if	__FLOAT_WORD_ORDER == __BIG_ENDIAN
 88	unsigned int mantissa0:20;
 89	unsigned int exponent:11;
 90	unsigned int negative:1;
 91	unsigned int mantissa1:32;
 92# else
 93	/* Together these comprise the mantissa.  */
 94	unsigned int mantissa1:32;
 95	unsigned int mantissa0:20;
 96	unsigned int exponent:11;
 97	unsigned int negative:1;
 98# endif
 99#endif				/* Little endian.  */
100      } ieee;
101
102    /* This format makes it easier to see if a NaN is a signalling NaN.  */
103    struct
104      {
105#if	__BYTE_ORDER == __BIG_ENDIAN
106	unsigned int negative:1;
107	unsigned int exponent:11;
108	unsigned int quiet_nan:1;
109	/* Together these comprise the mantissa.  */
110	unsigned int mantissa0:19;
111	unsigned int mantissa1:32;
112#else
113# if	__FLOAT_WORD_ORDER == __BIG_ENDIAN
114	unsigned int mantissa0:19;
115	unsigned int quiet_nan:1;
116	unsigned int exponent:11;
117	unsigned int negative:1;
118	unsigned int mantissa1:32;
119# else
120	/* Together these comprise the mantissa.  */
121	unsigned int mantissa1:32;
122	unsigned int mantissa0:19;
123	unsigned int quiet_nan:1;
124	unsigned int exponent:11;
125	unsigned int negative:1;
126# endif
127#endif
128      } ieee_nan;
129  };
130
131#define IEEE754_DOUBLE_BIAS	0x3ff /* Added to exponent.  */
132
133#if __LDBL_MANT_DIG__ == 113
134
135union ieee854_long_double
136  {
137    long double d;
138
139    /* This is the IEEE 854 quad-precision format.  */
140    struct
141      {
142#if	__BYTE_ORDER == __BIG_ENDIAN
143	unsigned int negative:1;
144	unsigned int exponent:15;
145	/* Together these comprise the mantissa.  */
146	unsigned int mantissa0:16;
147	unsigned int mantissa1:32;
148	unsigned int mantissa2:32;
149	unsigned int mantissa3:32;
150#endif				/* Big endian.  */
151#if	__BYTE_ORDER == __LITTLE_ENDIAN
152	/* Together these comprise the mantissa.  */
153	unsigned int mantissa3:32;
154	unsigned int mantissa2:32;
155	unsigned int mantissa1:32;
156	unsigned int mantissa0:16;
157	unsigned int exponent:15;
158	unsigned int negative:1;
159#endif				/* Little endian.  */
160      } ieee;
161
162    /* This format makes it easier to see if a NaN is a signalling NaN.  */
163    struct
164      {
165#if	__BYTE_ORDER == __BIG_ENDIAN
166	unsigned int negative:1;
167	unsigned int exponent:15;
168	unsigned int quiet_nan:1;
169	/* Together these comprise the mantissa.  */
170	unsigned int mantissa0:15;
171	unsigned int mantissa1:32;
172	unsigned int mantissa2:32;
173	unsigned int mantissa3:32;
174#endif				/* Big endian.  */
175#if	__BYTE_ORDER == __LITTLE_ENDIAN
176	/* Together these comprise the mantissa.  */
177	unsigned int mantissa3:32;
178	unsigned int mantissa2:32;
179	unsigned int mantissa1:32;
180	unsigned int mantissa0:15;
181	unsigned int quiet_nan:1;
182	unsigned int exponent:15;
183	unsigned int negative:1;
184#endif				/* Little endian.  */
185      } ieee_nan;
186  };
187
188#define IEEE854_LONG_DOUBLE_BIAS 0x3fff /* Added to exponent.  */
189
190#elif __LDBL_MANT_DIG__ == 64
191
192union ieee854_long_double
193  {
194    long double d;
195
196    /* This is the IEEE 854 double-extended-precision format.  */
197    struct
198      {
199#if	__BYTE_ORDER == __BIG_ENDIAN
200	unsigned int negative:1;
201	unsigned int exponent:15;
202	unsigned int empty:16;
203	unsigned int mantissa0:32;
204	unsigned int mantissa1:32;
205#endif
206#if	__BYTE_ORDER == __LITTLE_ENDIAN
207# if	__FLOAT_WORD_ORDER == __BIG_ENDIAN
208	unsigned int exponent:15;
209	unsigned int negative:1;
210	unsigned int empty:16;
211	unsigned int mantissa0:32;
212	unsigned int mantissa1:32;
213# else
214	unsigned int mantissa1:32;
215	unsigned int mantissa0:32;
216	unsigned int exponent:15;
217	unsigned int negative:1;
218	unsigned int empty:16;
219# endif
220#endif
221      } ieee;
222
223    /* This is for NaNs in the IEEE 854 double-extended-precision format.  */
224    struct
225      {
226#if	__BYTE_ORDER == __BIG_ENDIAN
227	unsigned int negative:1;
228	unsigned int exponent:15;
229	unsigned int empty:16;
230	unsigned int one:1;
231	unsigned int quiet_nan:1;
232	unsigned int mantissa0:30;
233	unsigned int mantissa1:32;
234#endif
235#if	__BYTE_ORDER == __LITTLE_ENDIAN
236# if	__FLOAT_WORD_ORDER == __BIG_ENDIAN
237	unsigned int exponent:15;
238	unsigned int negative:1;
239	unsigned int empty:16;
240	unsigned int mantissa0:30;
241	unsigned int quiet_nan:1;
242	unsigned int one:1;
243	unsigned int mantissa1:32;
244# else
245	unsigned int mantissa1:32;
246	unsigned int mantissa0:30;
247	unsigned int quiet_nan:1;
248	unsigned int one:1;
249	unsigned int exponent:15;
250	unsigned int negative:1;
251	unsigned int empty:16;
252# endif
253#endif
254      } ieee_nan;
255  };
256
257#define IEEE854_LONG_DOUBLE_BIAS 0x3fff
258
259#elif __LDBL_MANT_DIG__ == 53
260
261union ieee854_long_double
262  {
263    long double d;
264
265    /* This is the IEEE 754 double-precision format.  */
266    struct
267      {
268#if	__BYTE_ORDER == __BIG_ENDIAN
269	unsigned int negative:1;
270	unsigned int exponent:11;
271	/* Together these comprise the mantissa.  */
272	unsigned int mantissa0:20;
273	unsigned int mantissa1:32;
274#endif				/* Big endian.  */
275#if	__BYTE_ORDER == __LITTLE_ENDIAN
276# if	__FLOAT_WORD_ORDER == __BIG_ENDIAN
277	unsigned int mantissa0:20;
278	unsigned int exponent:11;
279	unsigned int negative:1;
280	unsigned int mantissa1:32;
281# else
282	/* Together these comprise the mantissa.  */
283	unsigned int mantissa1:32;
284	unsigned int mantissa0:20;
285	unsigned int exponent:11;
286	unsigned int negative:1;
287# endif
288#endif				/* Little endian.  */
289      } ieee;
290
291    /* This format makes it easier to see if a NaN is a signalling NaN.  */
292    struct
293      {
294#if	__BYTE_ORDER == __BIG_ENDIAN
295	unsigned int negative:1;
296	unsigned int exponent:11;
297	unsigned int quiet_nan:1;
298	/* Together these comprise the mantissa.  */
299	unsigned int mantissa0:19;
300	unsigned int mantissa1:32;
301#else
302# if	__FLOAT_WORD_ORDER == __BIG_ENDIAN
303	unsigned int mantissa0:19;
304	unsigned int quiet_nan:1;
305	unsigned int exponent:11;
306	unsigned int negative:1;
307	unsigned int mantissa1:32;
308# else
309	/* Together these comprise the mantissa.  */
310	unsigned int mantissa1:32;
311	unsigned int mantissa0:19;
312	unsigned int quiet_nan:1;
313	unsigned int exponent:11;
314	unsigned int negative:1;
315# endif
316#endif
317      } ieee_nan;
318  };
319
320#define IEEE854_LONG_DOUBLE_BIAS	0x3ff /* Added to exponent.  */
321
322#endif /* __LDBL_MANT_DIG__ == 53 */
323
324__END_DECLS
325
326#endif /* ieee754.h */