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 #ifndef __LDBL_MANT_DIG__ 26 # include <float.h> 27 # define __LDBL_MANT_DIG__ LDBL_MANT_DIG 28 #endif 29 30 __BEGIN_DECLS 31 32 union 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 72 union 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 135 union 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 192 union 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 261 union 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 */