| /* Copyright (C) 1992-2014 Free Software Foundation, Inc. |
| This file is part of the GNU C Library. |
| |
| The GNU C Library is free software; you can redistribute it and/or |
| modify it under the terms of the GNU Lesser General Public |
| License as published by the Free Software Foundation; either |
| version 2.1 of the License, or (at your option) any later version. |
| |
| The GNU C Library is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| Lesser General Public License for more details. |
| |
| You should have received a copy of the GNU Lesser General Public |
| License along with the GNU C Library; if not, see |
| <http://www.gnu.org/licenses/>. */ |
| |
| #ifndef _IEEE754_H |
| |
| #define _IEEE754_H 1 |
| #include <features.h> |
| |
| #include <endian.h> |
| |
| __BEGIN_DECLS |
| |
| union ieee754_float |
| { |
| float f; |
| |
| /* This is the IEEE 754 single-precision format. */ |
| struct |
| { |
| #if __BYTE_ORDER == __BIG_ENDIAN |
| unsigned int negative:1; |
| unsigned int exponent:8; |
| unsigned int mantissa:23; |
| #endif /* Big endian. */ |
| #if __BYTE_ORDER == __LITTLE_ENDIAN |
| unsigned int mantissa:23; |
| unsigned int exponent:8; |
| unsigned int negative:1; |
| #endif /* Little endian. */ |
| } ieee; |
| |
| /* This format makes it easier to see if a NaN is a signalling NaN. */ |
| struct |
| { |
| #if __BYTE_ORDER == __BIG_ENDIAN |
| unsigned int negative:1; |
| unsigned int exponent:8; |
| unsigned int quiet_nan:1; |
| unsigned int mantissa:22; |
| #endif /* Big endian. */ |
| #if __BYTE_ORDER == __LITTLE_ENDIAN |
| unsigned int mantissa:22; |
| unsigned int quiet_nan:1; |
| unsigned int exponent:8; |
| unsigned int negative:1; |
| #endif /* Little endian. */ |
| } ieee_nan; |
| }; |
| |
| #define IEEE754_FLOAT_BIAS 0x7f /* Added to exponent. */ |
| |
| |
| union ieee754_double |
| { |
| double d; |
| |
| /* This is the IEEE 754 double-precision format. */ |
| struct |
| { |
| #if __BYTE_ORDER == __BIG_ENDIAN |
| unsigned int negative:1; |
| unsigned int exponent:11; |
| /* Together these comprise the mantissa. */ |
| unsigned int mantissa0:20; |
| unsigned int mantissa1:32; |
| #endif /* Big endian. */ |
| #if __BYTE_ORDER == __LITTLE_ENDIAN |
| /* Together these comprise the mantissa. */ |
| unsigned int mantissa1:32; |
| unsigned int mantissa0:20; |
| unsigned int exponent:11; |
| unsigned int negative:1; |
| #endif /* Little endian. */ |
| } ieee; |
| |
| /* This format makes it easier to see if a NaN is a signalling NaN. */ |
| struct |
| { |
| #if __BYTE_ORDER == __BIG_ENDIAN |
| unsigned int negative:1; |
| unsigned int exponent:11; |
| unsigned int quiet_nan:1; |
| /* Together these comprise the mantissa. */ |
| unsigned int mantissa0:19; |
| unsigned int mantissa1:32; |
| #else |
| /* Together these comprise the mantissa. */ |
| unsigned int mantissa1:32; |
| unsigned int mantissa0:19; |
| unsigned int quiet_nan:1; |
| unsigned int exponent:11; |
| unsigned int negative:1; |
| #endif |
| } ieee_nan; |
| }; |
| |
| #define IEEE754_DOUBLE_BIAS 0x3ff /* Added to exponent. */ |
| |
| |
| /* IBM extended format for long double. |
| |
| Each long double is made up of two IEEE doubles. The value of the |
| long double is the sum of the values of the two parts. The most |
| significant part is required to be the value of the long double |
| rounded to the nearest double, as specified by IEEE. For Inf |
| values, the least significant part is required to be one of +0.0 or |
| -0.0. No other requirements are made; so, for example, 1.0 may be |
| represented as (1.0, +0.0) or (1.0, -0.0), and the low part of a |
| NaN is don't-care. */ |
| |
| union ibm_extended_long_double |
| { |
| long double ld; |
| union ieee754_double d[2]; |
| }; |
| |
| __END_DECLS |
| |
| #endif /* ieee754.h */ |