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__BEGIN_DECLS
 26
 27union ieee754_float
 28  {
 29    float f;
 30
 31    /* This is the IEEE 754 single-precision format.  */
 32    struct
 33      {
 34#if	__BYTE_ORDER == __BIG_ENDIAN
 35	unsigned int negative:1;
 36	unsigned int exponent:8;
 37	unsigned int mantissa:23;
 38#endif				/* Big endian.  */
 39#if	__BYTE_ORDER == __LITTLE_ENDIAN
 40	unsigned int mantissa:23;
 41	unsigned int exponent:8;
 42	unsigned int negative:1;
 43#endif				/* Little endian.  */
 44      } ieee;
 45
 46    /* This format makes it easier to see if a NaN is a signalling NaN.  */
 47    struct
 48      {
 49#if	__BYTE_ORDER == __BIG_ENDIAN
 50	unsigned int negative:1;
 51	unsigned int exponent:8;
 52	unsigned int quiet_nan:1;
 53	unsigned int mantissa:22;
 54#endif				/* Big endian.  */
 55#if	__BYTE_ORDER == __LITTLE_ENDIAN
 56	unsigned int mantissa:22;
 57	unsigned int quiet_nan:1;
 58	unsigned int exponent:8;
 59	unsigned int negative:1;
 60#endif				/* Little endian.  */
 61      } ieee_nan;
 62  };
 63
 64#define IEEE754_FLOAT_BIAS	0x7f /* Added to exponent.  */
 65
 66
 67union ieee754_double
 68  {
 69    double d;
 70
 71    /* This is the IEEE 754 double-precision format.  */
 72    struct
 73      {
 74#if	__BYTE_ORDER == __BIG_ENDIAN
 75	unsigned int negative:1;
 76	unsigned int exponent:11;
 77	/* Together these comprise the mantissa.  */
 78	unsigned int mantissa0:20;
 79	unsigned int mantissa1:32;
 80#endif				/* Big endian.  */
 81#if	__BYTE_ORDER == __LITTLE_ENDIAN
 82# if	__FLOAT_WORD_ORDER == __BIG_ENDIAN
 83	unsigned int mantissa0:20;
 84	unsigned int exponent:11;
 85	unsigned int negative:1;
 86	unsigned int mantissa1:32;
 87# else
 88	/* Together these comprise the mantissa.  */
 89	unsigned int mantissa1:32;
 90	unsigned int mantissa0:20;
 91	unsigned int exponent:11;
 92	unsigned int negative:1;
 93# endif
 94#endif				/* Little endian.  */
 95      } ieee;
 96
 97    /* This format makes it easier to see if a NaN is a signalling NaN.  */
 98    struct
 99      {
100#if	__BYTE_ORDER == __BIG_ENDIAN
101	unsigned int negative:1;
102	unsigned int exponent:11;
103	unsigned int quiet_nan:1;
104	/* Together these comprise the mantissa.  */
105	unsigned int mantissa0:19;
106	unsigned int mantissa1:32;
107#else
108# if	__FLOAT_WORD_ORDER == __BIG_ENDIAN
109	unsigned int mantissa0:19;
110	unsigned int quiet_nan:1;
111	unsigned int exponent:11;
112	unsigned int negative:1;
113	unsigned int mantissa1:32;
114# else
115	/* Together these comprise the mantissa.  */
116	unsigned int mantissa1:32;
117	unsigned int mantissa0:19;
118	unsigned int quiet_nan:1;
119	unsigned int exponent:11;
120	unsigned int negative:1;
121# endif
122#endif
123      } ieee_nan;
124  };
125
126#define IEEE754_DOUBLE_BIAS	0x3ff /* Added to exponent.  */
127
128
129union ieee854_long_double
130  {
131    long double d;
132
133    /* This is the IEEE 854 double-extended-precision format.  */
134    struct
135      {
136#if	__BYTE_ORDER == __BIG_ENDIAN
137	unsigned int negative:1;
138	unsigned int exponent:15;
139	unsigned int empty:16;
140	unsigned int mantissa0:32;
141	unsigned int mantissa1:32;
142#endif
143#if	__BYTE_ORDER == __LITTLE_ENDIAN
144# if	__FLOAT_WORD_ORDER == __BIG_ENDIAN
145	unsigned int exponent:15;
146	unsigned int negative:1;
147	unsigned int empty:16;
148	unsigned int mantissa0:32;
149	unsigned int mantissa1:32;
150# else
151	unsigned int mantissa1:32;
152	unsigned int mantissa0:32;
153	unsigned int exponent:15;
154	unsigned int negative:1;
155	unsigned int empty:16;
156# endif
157#endif
158      } ieee;
159
160    /* This is for NaNs in the IEEE 854 double-extended-precision format.  */
161    struct
162      {
163#if	__BYTE_ORDER == __BIG_ENDIAN
164	unsigned int negative:1;
165	unsigned int exponent:15;
166	unsigned int empty:16;
167	unsigned int one:1;
168	unsigned int quiet_nan:1;
169	unsigned int mantissa0:30;
170	unsigned int mantissa1:32;
171#endif
172#if	__BYTE_ORDER == __LITTLE_ENDIAN
173# if	__FLOAT_WORD_ORDER == __BIG_ENDIAN
174	unsigned int exponent:15;
175	unsigned int negative:1;
176	unsigned int empty:16;
177	unsigned int mantissa0:30;
178	unsigned int quiet_nan:1;
179	unsigned int one:1;
180	unsigned int mantissa1:32;
181# else
182	unsigned int mantissa1:32;
183	unsigned int mantissa0:30;
184	unsigned int quiet_nan:1;
185	unsigned int one:1;
186	unsigned int exponent:15;
187	unsigned int negative:1;
188	unsigned int empty:16;
189# endif
190#endif
191      } ieee_nan;
192  };
193
194#define IEEE854_LONG_DOUBLE_BIAS 0x3fff
195
196__END_DECLS
197
198#endif /* ieee754.h */