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