1 /* Copyright (C) 2000-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 # if __FLOAT_WORD_ORDER == __BIG_ENDIAN 83 unsigned int mantissa0:20; 84 unsigned int exponent:11; 85 unsigned int negative:1; 86 unsigned int mantissa1:32; 87 # else 88 /* Together these comprise the mantissa. */ 89 unsigned int mantissa1:32; 90 unsigned int mantissa0:20; 91 unsigned int exponent:11; 92 unsigned int negative:1; 93 # endif 94 #endif /* Little endian. */ 95 } ieee; 96 97 /* This format makes it easier to see if a NaN is a signalling NaN. */ 98 struct 99 { 100 #if __BYTE_ORDER == __BIG_ENDIAN 101 unsigned int negative:1; 102 unsigned int exponent:11; 103 unsigned int quiet_nan:1; 104 /* Together these comprise the mantissa. */ 105 unsigned int mantissa0:19; 106 unsigned int mantissa1:32; 107 #else 108 # if __FLOAT_WORD_ORDER == __BIG_ENDIAN 109 unsigned int mantissa0:19; 110 unsigned int quiet_nan:1; 111 unsigned int exponent:11; 112 unsigned int negative:1; 113 unsigned int mantissa1:32; 114 # else 115 /* Together these comprise the mantissa. */ 116 unsigned int mantissa1:32; 117 unsigned int mantissa0:19; 118 unsigned int quiet_nan:1; 119 unsigned int exponent:11; 120 unsigned int negative:1; 121 # endif 122 #endif 123 } ieee_nan; 124 }; 125 126 #define IEEE754_DOUBLE_BIAS 0x3ff /* Added to exponent. */ 127 128 129 union ieee854_long_double 130 { 131 long double d; 132 133 /* This is the IEEE 854 double-extended-precision format. */ 134 struct 135 { 136 #if __BYTE_ORDER == __BIG_ENDIAN 137 unsigned int empty0:32; 138 unsigned int negative:1; 139 unsigned int exponent:15; 140 unsigned int empty1:16; 141 unsigned int mantissa0:32; 142 unsigned int mantissa1:32; 143 #endif 144 #if __BYTE_ORDER == __LITTLE_ENDIAN 145 # if __FLOAT_WORD_ORDER == __BIG_ENDIAN 146 unsigned int empty0:32; 147 unsigned int exponent:15; 148 unsigned int negative:1; 149 unsigned int empty1:16; 150 unsigned int mantissa0:32; 151 unsigned int mantissa1:32; 152 # else 153 unsigned int mantissa1:32; 154 unsigned int mantissa0:32; 155 unsigned int exponent:15; 156 unsigned int negative:1; 157 unsigned int empty1:16; 158 unsigned int empty0:32; 159 # endif 160 #endif 161 } ieee; 162 163 /* This is for NaNs in the IEEE 854 double-extended-precision format. */ 164 struct 165 { 166 #if __BYTE_ORDER == __BIG_ENDIAN 167 unsigned int empty0:32; 168 unsigned int negative:1; 169 unsigned int exponent:15; 170 unsigned int empty1:16; 171 unsigned int one:1; 172 unsigned int quiet_nan:1; 173 unsigned int mantissa0:30; 174 unsigned int mantissa1:32; 175 #endif 176 #if __BYTE_ORDER == __LITTLE_ENDIAN 177 # if __FLOAT_WORD_ORDER == __BIG_ENDIAN 178 unsigned int empty0:32; 179 unsigned int exponent:15; 180 unsigned int negative:1; 181 unsigned int empty1:16; 182 unsigned int mantissa0:30; 183 unsigned int quiet_nan:1; 184 unsigned int one:1; 185 unsigned int mantissa1:32; 186 # else 187 unsigned int mantissa1:32; 188 unsigned int mantissa0:30; 189 unsigned int quiet_nan:1; 190 unsigned int one:1; 191 unsigned int exponent:15; 192 unsigned int negative:1; 193 unsigned int empty1:16; 194 unsigned int empty0:32; 195 # endif 196 #endif 197 } ieee_nan; 198 }; 199 200 #define IEEE854_LONG_DOUBLE_BIAS 0x3fff 201 202 __END_DECLS 203 204 #endif /* ieee754.h */ 205