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 */ 171