1 /* Copyright (C) 1992, 1995, 1996, 1999 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, write to the Free 16 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 17 02111-1307 USA. */ 18 19 #ifndef _IEEE754_H 20 21 #define _IEEE754_H 1 22 #include <features.h> 23 24 #include <endian.h> 25 26 __BEGIN_DECLS 27 28 union ieee754_float 29 { 30 float f; 31 32 /* This is the IEEE 754 single-precision format. */ 33 struct 34 { 35 #if __BYTE_ORDER == __BIG_ENDIAN 36 unsigned int negative:1; 37 unsigned int exponent:8; 38 unsigned int mantissa:23; 39 #endif /* Big endian. */ 40 #if __BYTE_ORDER == __LITTLE_ENDIAN 41 unsigned int mantissa:23; 42 unsigned int exponent:8; 43 unsigned int negative:1; 44 #endif /* Little endian. */ 45 } ieee; 46 47 /* This format makes it easier to see if a NaN is a signalling NaN. */ 48 struct 49 { 50 #if __BYTE_ORDER == __BIG_ENDIAN 51 unsigned int negative:1; 52 unsigned int exponent:8; 53 unsigned int quiet_nan:1; 54 unsigned int mantissa:22; 55 #endif /* Big endian. */ 56 #if __BYTE_ORDER == __LITTLE_ENDIAN 57 unsigned int mantissa:22; 58 unsigned int quiet_nan:1; 59 unsigned int exponent:8; 60 unsigned int negative:1; 61 #endif /* Little endian. */ 62 } ieee_nan; 63 }; 64 65 #define IEEE754_FLOAT_BIAS 0x7f /* Added to exponent. */ 66 67 68 union ieee754_double 69 { 70 double d; 71 72 /* This is the IEEE 754 double-precision format. */ 73 struct 74 { 75 #if __BYTE_ORDER == __BIG_ENDIAN 76 unsigned int negative:1; 77 unsigned int exponent:11; 78 /* Together these comprise the mantissa. */ 79 unsigned int mantissa0:20; 80 unsigned int mantissa1:32; 81 #endif /* Big endian. */ 82 #if __BYTE_ORDER == __LITTLE_ENDIAN 83 # if __FLOAT_WORD_ORDER == BIG_ENDIAN 84 unsigned int mantissa0:20; 85 unsigned int exponent:11; 86 unsigned int negative:1; 87 unsigned int mantissa1:32; 88 # else 89 /* Together these comprise the mantissa. */ 90 unsigned int mantissa1:32; 91 unsigned int mantissa0:20; 92 unsigned int exponent:11; 93 unsigned int negative:1; 94 # endif 95 #endif /* Little endian. */ 96 } ieee; 97 98 /* This format makes it easier to see if a NaN is a signalling NaN. */ 99 struct 100 { 101 #if __BYTE_ORDER == __BIG_ENDIAN 102 unsigned int negative:1; 103 unsigned int exponent:11; 104 unsigned int quiet_nan:1; 105 /* Together these comprise the mantissa. */ 106 unsigned int mantissa0:19; 107 unsigned int mantissa1:32; 108 #else 109 # if __FLOAT_WORD_ORDER == BIG_ENDIAN 110 unsigned int mantissa0:19; 111 unsigned int quiet_nan:1; 112 unsigned int exponent:11; 113 unsigned int negative:1; 114 unsigned int mantissa1:32; 115 # else 116 /* Together these comprise the mantissa. */ 117 unsigned int mantissa1:32; 118 unsigned int mantissa0:19; 119 unsigned int quiet_nan:1; 120 unsigned int exponent:11; 121 unsigned int negative:1; 122 # endif 123 #endif 124 } ieee_nan; 125 }; 126 127 #define IEEE754_DOUBLE_BIAS 0x3ff /* Added to exponent. */ 128 129 130 union ieee854_long_double 131 { 132 long double d; 133 134 /* This is the IEEE 854 double-extended-precision format. */ 135 struct 136 { 137 #if __BYTE_ORDER == __BIG_ENDIAN 138 unsigned int negative:1; 139 unsigned int exponent:15; 140 unsigned int empty: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 exponent:15; 147 unsigned int negative:1; 148 unsigned int empty:16; 149 unsigned int mantissa0:32; 150 unsigned int mantissa1:32; 151 # else 152 unsigned int mantissa1:32; 153 unsigned int mantissa0:32; 154 unsigned int exponent:15; 155 unsigned int negative:1; 156 unsigned int empty:16; 157 # endif 158 #endif 159 } ieee; 160 161 /* This is for NaNs in the IEEE 854 double-extended-precision format. */ 162 struct 163 { 164 #if __BYTE_ORDER == __BIG_ENDIAN 165 unsigned int negative:1; 166 unsigned int exponent:15; 167 unsigned int empty:16; 168 unsigned int one:1; 169 unsigned int quiet_nan:1; 170 unsigned int mantissa0:30; 171 unsigned int mantissa1:32; 172 #endif 173 #if __BYTE_ORDER == __LITTLE_ENDIAN 174 # if __FLOAT_WORD_ORDER == BIG_ENDIAN 175 unsigned int exponent:15; 176 unsigned int negative:1; 177 unsigned int empty:16; 178 unsigned int mantissa0:30; 179 unsigned int quiet_nan:1; 180 unsigned int one:1; 181 unsigned int mantissa1:32; 182 # else 183 unsigned int mantissa1:32; 184 unsigned int mantissa0:30; 185 unsigned int quiet_nan:1; 186 unsigned int one:1; 187 unsigned int exponent:15; 188 unsigned int negative:1; 189 unsigned int empty:16; 190 # endif 191 #endif 192 } ieee_nan; 193 }; 194 195 #define IEEE854_LONG_DOUBLE_BIAS 0x3fff 196 197 __END_DECLS 198 199 #endif /* ieee754.h */ 200