1 /* Copyright (C) 1992, 1995, 1996, 1999, 2002, 2003 2 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library; if not, write to the Free 17 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 18 02111-1307 USA. */ 19 20 #ifndef _IEEE754_H 21 22 #define _IEEE754_H 1 23 #include <features.h> 24 25 #include <endian.h> 26 27 #include <float.h> 28 29 __BEGIN_DECLS 30 31 union ieee754_float 32 { 33 float f; 34 35 /* This is the IEEE 754 single-precision format. */ 36 struct 37 { 38 #if __BYTE_ORDER == __BIG_ENDIAN 39 unsigned int negative:1; 40 unsigned int exponent:8; 41 unsigned int mantissa:23; 42 #endif /* Big endian. */ 43 #if __BYTE_ORDER == __LITTLE_ENDIAN 44 unsigned int mantissa:23; 45 unsigned int exponent:8; 46 unsigned int negative:1; 47 #endif /* Little endian. */ 48 } ieee; 49 50 /* This format makes it easier to see if a NaN is a signalling NaN. */ 51 struct 52 { 53 #if __BYTE_ORDER == __BIG_ENDIAN 54 unsigned int negative:1; 55 unsigned int exponent:8; 56 unsigned int quiet_nan:1; 57 unsigned int mantissa:22; 58 #endif /* Big endian. */ 59 #if __BYTE_ORDER == __LITTLE_ENDIAN 60 unsigned int mantissa:22; 61 unsigned int quiet_nan:1; 62 unsigned int exponent:8; 63 unsigned int negative:1; 64 #endif /* Little endian. */ 65 } ieee_nan; 66 }; 67 68 #define IEEE754_FLOAT_BIAS 0x7f /* Added to exponent. */ 69 70 71 union ieee754_double 72 { 73 double d; 74 75 /* This is the IEEE 754 double-precision format. */ 76 struct 77 { 78 #if __BYTE_ORDER == __BIG_ENDIAN 79 unsigned int negative:1; 80 unsigned int exponent:11; 81 /* Together these comprise the mantissa. */ 82 unsigned int mantissa0:20; 83 unsigned int mantissa1:32; 84 #endif /* Big endian. */ 85 #if __BYTE_ORDER == __LITTLE_ENDIAN 86 # if __FLOAT_WORD_ORDER == __BIG_ENDIAN 87 unsigned int mantissa0:20; 88 unsigned int exponent:11; 89 unsigned int negative:1; 90 unsigned int mantissa1:32; 91 # else 92 /* Together these comprise the mantissa. */ 93 unsigned int mantissa1:32; 94 unsigned int mantissa0:20; 95 unsigned int exponent:11; 96 unsigned int negative:1; 97 # endif 98 #endif /* Little endian. */ 99 } ieee; 100 101 /* This format makes it easier to see if a NaN is a signalling NaN. */ 102 struct 103 { 104 #if __BYTE_ORDER == __BIG_ENDIAN 105 unsigned int negative:1; 106 unsigned int exponent:11; 107 unsigned int quiet_nan:1; 108 /* Together these comprise the mantissa. */ 109 unsigned int mantissa0:19; 110 unsigned int mantissa1:32; 111 #else 112 # if __FLOAT_WORD_ORDER == __BIG_ENDIAN 113 unsigned int mantissa0:19; 114 unsigned int quiet_nan:1; 115 unsigned int exponent:11; 116 unsigned int negative:1; 117 unsigned int mantissa1:32; 118 # else 119 /* Together these comprise the mantissa. */ 120 unsigned int mantissa1:32; 121 unsigned int mantissa0:19; 122 unsigned int quiet_nan:1; 123 unsigned int exponent:11; 124 unsigned int negative:1; 125 # endif 126 #endif 127 } ieee_nan; 128 }; 129 130 #define IEEE754_DOUBLE_BIAS 0x3ff /* Added to exponent. */ 131 132 #if LDBL_MANT_DIG == 113 133 134 union ieee854_long_double 135 { 136 long double d; 137 138 /* This is the IEEE 854 quad-precision format. */ 139 struct 140 { 141 #if __BYTE_ORDER == __BIG_ENDIAN 142 unsigned int negative:1; 143 unsigned int exponent:15; 144 /* Together these comprise the mantissa. */ 145 unsigned int mantissa0:16; 146 unsigned int mantissa1:32; 147 unsigned int mantissa2:32; 148 unsigned int mantissa3:32; 149 #endif /* Big endian. */ 150 #if __BYTE_ORDER == __LITTLE_ENDIAN 151 /* Together these comprise the mantissa. */ 152 unsigned int mantissa3:32; 153 unsigned int mantissa2:32; 154 unsigned int mantissa1:32; 155 unsigned int mantissa0:16; 156 unsigned int exponent:15; 157 unsigned int negative:1; 158 #endif /* Little endian. */ 159 } ieee; 160 161 /* This format makes it easier to see if a NaN is a signalling NaN. */ 162 struct 163 { 164 #if __BYTE_ORDER == __BIG_ENDIAN 165 unsigned int negative:1; 166 unsigned int exponent:15; 167 unsigned int quiet_nan:1; 168 /* Together these comprise the mantissa. */ 169 unsigned int mantissa0:15; 170 unsigned int mantissa1:32; 171 unsigned int mantissa2:32; 172 unsigned int mantissa3:32; 173 #endif /* Big endian. */ 174 #if __BYTE_ORDER == __LITTLE_ENDIAN 175 /* Together these comprise the mantissa. */ 176 unsigned int mantissa3:32; 177 unsigned int mantissa2:32; 178 unsigned int mantissa1:32; 179 unsigned int mantissa0:15; 180 unsigned int quiet_nan:1; 181 unsigned int exponent:15; 182 unsigned int negative:1; 183 #endif /* Little endian. */ 184 } ieee_nan; 185 }; 186 187 #define IEEE854_LONG_DOUBLE_BIAS 0x3fff /* Added to exponent. */ 188 189 #elif LDBL_MANT_DIG == 64 190 191 union ieee854_long_double 192 { 193 long double d; 194 195 /* This is the IEEE 854 double-extended-precision format. */ 196 struct 197 { 198 #if __BYTE_ORDER == __BIG_ENDIAN 199 unsigned int negative:1; 200 unsigned int exponent:15; 201 unsigned int empty:16; 202 unsigned int mantissa0:32; 203 unsigned int mantissa1:32; 204 #endif 205 #if __BYTE_ORDER == __LITTLE_ENDIAN 206 # if __FLOAT_WORD_ORDER == __BIG_ENDIAN 207 unsigned int exponent:15; 208 unsigned int negative:1; 209 unsigned int empty:16; 210 unsigned int mantissa0:32; 211 unsigned int mantissa1:32; 212 # else 213 unsigned int mantissa1:32; 214 unsigned int mantissa0:32; 215 unsigned int exponent:15; 216 unsigned int negative:1; 217 unsigned int empty:16; 218 # endif 219 #endif 220 } ieee; 221 222 /* This is for NaNs in the IEEE 854 double-extended-precision format. */ 223 struct 224 { 225 #if __BYTE_ORDER == __BIG_ENDIAN 226 unsigned int negative:1; 227 unsigned int exponent:15; 228 unsigned int empty:16; 229 unsigned int one:1; 230 unsigned int quiet_nan:1; 231 unsigned int mantissa0:30; 232 unsigned int mantissa1:32; 233 #endif 234 #if __BYTE_ORDER == __LITTLE_ENDIAN 235 # if __FLOAT_WORD_ORDER == __BIG_ENDIAN 236 unsigned int exponent:15; 237 unsigned int negative:1; 238 unsigned int empty:16; 239 unsigned int mantissa0:30; 240 unsigned int quiet_nan:1; 241 unsigned int one:1; 242 unsigned int mantissa1:32; 243 # else 244 unsigned int mantissa1:32; 245 unsigned int mantissa0:30; 246 unsigned int quiet_nan:1; 247 unsigned int one:1; 248 unsigned int exponent:15; 249 unsigned int negative:1; 250 unsigned int empty:16; 251 # endif 252 #endif 253 } ieee_nan; 254 }; 255 256 #define IEEE854_LONG_DOUBLE_BIAS 0x3fff 257 258 #elif LDBL_MANT_DIG == 53 259 260 union ieee854_long_double 261 { 262 long double d; 263 264 /* This is the IEEE 754 double-precision format. */ 265 struct 266 { 267 #if __BYTE_ORDER == __BIG_ENDIAN 268 unsigned int negative:1; 269 unsigned int exponent:11; 270 /* Together these comprise the mantissa. */ 271 unsigned int mantissa0:20; 272 unsigned int mantissa1:32; 273 #endif /* Big endian. */ 274 #if __BYTE_ORDER == __LITTLE_ENDIAN 275 # if __FLOAT_WORD_ORDER == __BIG_ENDIAN 276 unsigned int mantissa0:20; 277 unsigned int exponent:11; 278 unsigned int negative:1; 279 unsigned int mantissa1:32; 280 # else 281 /* Together these comprise the mantissa. */ 282 unsigned int mantissa1:32; 283 unsigned int mantissa0:20; 284 unsigned int exponent:11; 285 unsigned int negative:1; 286 # endif 287 #endif /* Little endian. */ 288 } ieee; 289 290 /* This format makes it easier to see if a NaN is a signalling NaN. */ 291 struct 292 { 293 #if __BYTE_ORDER == __BIG_ENDIAN 294 unsigned int negative:1; 295 unsigned int exponent:11; 296 unsigned int quiet_nan:1; 297 /* Together these comprise the mantissa. */ 298 unsigned int mantissa0:19; 299 unsigned int mantissa1:32; 300 #else 301 # if __FLOAT_WORD_ORDER == __BIG_ENDIAN 302 unsigned int mantissa0:19; 303 unsigned int quiet_nan:1; 304 unsigned int exponent:11; 305 unsigned int negative:1; 306 unsigned int mantissa1:32; 307 # else 308 /* Together these comprise the mantissa. */ 309 unsigned int mantissa1:32; 310 unsigned int mantissa0:19; 311 unsigned int quiet_nan:1; 312 unsigned int exponent:11; 313 unsigned int negative:1; 314 # endif 315 #endif 316 } ieee_nan; 317 }; 318 319 #define IEEE854_LONG_DOUBLE_BIAS 0x3ff /* Added to exponent. */ 320 321 #endif /* LDBL_MANT_DIG == 53 */ 322 323 __END_DECLS 324 325 #endif /* ieee754.h */ 326