1 /* Copyright (C) 1992-2022 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 #include <bits/floatn.h> 25 26 __BEGIN_DECLS 27 28 union ieee754_float 29 { 30 float f; 31 32 /* This is the IEEE 754 single-precision format. */ 33 struct 34 { 35 #if __BYTE_ORDER == __BIG_ENDIAN 36 unsigned int negative:1; 37 unsigned int exponent:8; 38 unsigned int mantissa:23; 39 #endif /* Big endian. */ 40 #if __BYTE_ORDER == __LITTLE_ENDIAN 41 unsigned int mantissa:23; 42 unsigned int exponent:8; 43 unsigned int negative:1; 44 #endif /* Little endian. */ 45 } ieee; 46 47 /* This format makes it easier to see if a NaN is a signalling NaN. */ 48 struct 49 { 50 #if __BYTE_ORDER == __BIG_ENDIAN 51 unsigned int negative:1; 52 unsigned int exponent:8; 53 unsigned int quiet_nan:1; 54 unsigned int mantissa:22; 55 #endif /* Big endian. */ 56 #if __BYTE_ORDER == __LITTLE_ENDIAN 57 unsigned int mantissa:22; 58 unsigned int quiet_nan:1; 59 unsigned int exponent:8; 60 unsigned int negative:1; 61 #endif /* Little endian. */ 62 } ieee_nan; 63 }; 64 65 #define IEEE754_FLOAT_BIAS 0x7f /* Added to exponent. */ 66 67 68 union ieee754_double 69 { 70 double d; 71 72 /* This is the IEEE 754 double-precision format. */ 73 struct 74 { 75 #if __BYTE_ORDER == __BIG_ENDIAN 76 unsigned int negative:1; 77 unsigned int exponent:11; 78 /* Together these comprise the mantissa. */ 79 unsigned int mantissa0:20; 80 unsigned int mantissa1:32; 81 #endif /* Big endian. */ 82 #if __BYTE_ORDER == __LITTLE_ENDIAN 83 /* Together these comprise the mantissa. */ 84 unsigned int mantissa1:32; 85 unsigned int mantissa0:20; 86 unsigned int exponent:11; 87 unsigned int negative:1; 88 #endif /* Little endian. */ 89 } ieee; 90 91 /* This format makes it easier to see if a NaN is a signalling NaN. */ 92 struct 93 { 94 #if __BYTE_ORDER == __BIG_ENDIAN 95 unsigned int negative:1; 96 unsigned int exponent:11; 97 unsigned int quiet_nan:1; 98 /* Together these comprise the mantissa. */ 99 unsigned int mantissa0:19; 100 unsigned int mantissa1:32; 101 #else 102 /* Together these comprise the mantissa. */ 103 unsigned int mantissa1:32; 104 unsigned int mantissa0:19; 105 unsigned int quiet_nan:1; 106 unsigned int exponent:11; 107 unsigned int negative:1; 108 #endif 109 } ieee_nan; 110 }; 111 112 #define IEEE754_DOUBLE_BIAS 0x3ff /* Added to exponent. */ 113 114 115 #if __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 1 116 /* long double is IEEE 128 bit */ 117 union ieee854_long_double 118 { 119 long double d; 120 121 /* This is the IEEE 854 quad-precision format. */ 122 struct 123 { 124 #if __BYTE_ORDER == __BIG_ENDIAN 125 unsigned int negative:1; 126 unsigned int exponent:15; 127 /* Together these comprise the mantissa. */ 128 unsigned int mantissa0:16; 129 unsigned int mantissa1:32; 130 unsigned int mantissa2:32; 131 unsigned int mantissa3:32; 132 #endif /* Big endian. */ 133 #if __BYTE_ORDER == __LITTLE_ENDIAN 134 /* Together these comprise the mantissa. */ 135 unsigned int mantissa3:32; 136 unsigned int mantissa2:32; 137 unsigned int mantissa1:32; 138 unsigned int mantissa0:16; 139 unsigned int exponent:15; 140 unsigned int negative:1; 141 #endif /* Little endian. */ 142 } ieee; 143 144 /* This format makes it easier to see if a NaN is a signalling NaN. */ 145 struct 146 { 147 #if __BYTE_ORDER == __BIG_ENDIAN 148 unsigned int negative:1; 149 unsigned int exponent:15; 150 unsigned int quiet_nan:1; 151 /* Together these comprise the mantissa. */ 152 unsigned int mantissa0:15; 153 unsigned int mantissa1:32; 154 unsigned int mantissa2:32; 155 unsigned int mantissa3:32; 156 #else 157 /* Together these comprise the mantissa. */ 158 unsigned int mantissa3:32; 159 unsigned int mantissa2:32; 160 unsigned int mantissa1:32; 161 unsigned int mantissa0:15; 162 unsigned int quiet_nan:1; 163 unsigned int exponent:15; 164 unsigned int negative:1; 165 #endif 166 } ieee_nan; 167 }; 168 169 #define IEEE854_LONG_DOUBLE_BIAS 0x3fff /* Added to exponent. */ 170 #endif 171 172 173 #if __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 0 || __GNUC_PREREQ (7, 0) 174 /* IBM extended format for long double. 175 176 Each long double is made up of two IEEE doubles. The value of the 177 long double is the sum of the values of the two parts. The most 178 significant part is required to be the value of the long double 179 rounded to the nearest double, as specified by IEEE. For Inf 180 values, the least significant part is required to be one of +0.0 or 181 -0.0. No other requirements are made; so, for example, 1.0 may be 182 represented as (1.0, +0.0) or (1.0, -0.0), and the low part of a 183 NaN is don't-care. */ 184 union ibm_extended_long_double 185 { 186 # if __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 1 && __GNUC_PREREQ (7, 0) 187 __ibm128 ld; 188 # else 189 long double ld; 190 # endif 191 union ieee754_double d[2]; 192 }; 193 #endif 194 195 __END_DECLS 196 197 #endif /* ieee754.h */ 198