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	/* Together these comprise the mantissa.  */
 83	unsigned int mantissa1:32;
 84	unsigned int mantissa0:20;
 85	unsigned int exponent:11;
 86	unsigned int negative:1;
 87#endif				/* Little endian.  */
 88      } ieee;
 89
 90    /* This format makes it easier to see if a NaN is a signalling NaN.  */
 91    struct
 92      {
 93#if	__BYTE_ORDER == __BIG_ENDIAN
 94	unsigned int negative:1;
 95	unsigned int exponent:11;
 96	unsigned int quiet_nan:1;
 97	/* Together these comprise the mantissa.  */
 98	unsigned int mantissa0:19;
 99	unsigned int mantissa1:32;
100#else
101	/* Together these comprise the mantissa.  */
102	unsigned int mantissa1:32;
103	unsigned int mantissa0:19;
104	unsigned int quiet_nan:1;
105	unsigned int exponent:11;
106	unsigned int negative:1;
107#endif
108      } ieee_nan;
109  };
110
111#define IEEE754_DOUBLE_BIAS	0x3ff /* Added to exponent.  */
112
113
114union ieee854_long_double
115  {
116    long double d;
117
118    /* This is the IEEE 854 quad-precision format.  */
119    struct
120      {
121#if	__BYTE_ORDER == __BIG_ENDIAN
122	unsigned int negative:1;
123	unsigned int exponent:15;
124	/* Together these comprise the mantissa.  */
125	unsigned int mantissa0:16;
126	unsigned int mantissa1:32;
127	unsigned int mantissa2:32;
128	unsigned int mantissa3:32;
129#endif				/* Big endian.  */
130#if	__BYTE_ORDER == __LITTLE_ENDIAN
131	/* Together these comprise the mantissa.  */
132	unsigned int mantissa3:32;
133	unsigned int mantissa2:32;
134	unsigned int mantissa1:32;
135	unsigned int mantissa0:16;
136	unsigned int exponent:15;
137	unsigned int negative:1;
138#endif				/* Little endian.  */
139      } ieee;
140
141    /* This format makes it easier to see if a NaN is a signalling NaN.  */
142    struct
143      {
144#if	__BYTE_ORDER == __BIG_ENDIAN
145	unsigned int negative:1;
146	unsigned int exponent:15;
147	unsigned int quiet_nan:1;
148	/* Together these comprise the mantissa.  */
149	unsigned int mantissa0:15;
150	unsigned int mantissa1:32;
151	unsigned int mantissa2:32;
152	unsigned int mantissa3:32;
153#else
154	/* Together these comprise the mantissa.  */
155	unsigned int mantissa3:32;
156	unsigned int mantissa2:32;
157	unsigned int mantissa1:32;
158	unsigned int mantissa0:15;
159	unsigned int quiet_nan:1;
160	unsigned int exponent:15;
161	unsigned int negative:1;
162#endif
163      } ieee_nan;
164  };
165
166#define IEEE854_LONG_DOUBLE_BIAS 0x3fff /* Added to exponent.  */
167
168__END_DECLS
169
170#endif /* ieee754.h */