1 /* Copyright (C) 1992-2021 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 
27 union 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 
67 union 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 
114 union 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 */