| /* Copyright (C) 1992-2013 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> |
| |
| #include <float.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 |
| # if __FLOAT_WORD_ORDER == __BIG_ENDIAN |
| unsigned int mantissa0:20; |
| unsigned int exponent:11; |
| unsigned int negative:1; |
| unsigned int mantissa1:32; |
| # else |
| /* Together these comprise the mantissa. */ |
| unsigned int mantissa1:32; |
| unsigned int mantissa0:20; |
| unsigned int exponent:11; |
| unsigned int negative:1; |
| # endif |
| #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 |
| # if __FLOAT_WORD_ORDER == __BIG_ENDIAN |
| unsigned int mantissa0:19; |
| unsigned int quiet_nan:1; |
| unsigned int exponent:11; |
| unsigned int negative:1; |
| 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 |
| #endif |
| } ieee_nan; |
| }; |
| |
| #define IEEE754_DOUBLE_BIAS 0x3ff /* Added to exponent. */ |
| |
| #if LDBL_MANT_DIG == 113 |
| |
| union ieee854_long_double |
| { |
| long double d; |
| |
| /* This is the IEEE 854 quad-precision format. */ |
| struct |
| { |
| #if __BYTE_ORDER == __BIG_ENDIAN |
| unsigned int negative:1; |
| unsigned int exponent:15; |
| /* Together these comprise the mantissa. */ |
| unsigned int mantissa0:16; |
| unsigned int mantissa1:32; |
| unsigned int mantissa2:32; |
| unsigned int mantissa3:32; |
| #endif /* Big endian. */ |
| #if __BYTE_ORDER == __LITTLE_ENDIAN |
| /* Together these comprise the mantissa. */ |
| unsigned int mantissa3:32; |
| unsigned int mantissa2:32; |
| unsigned int mantissa1:32; |
| unsigned int mantissa0:16; |
| unsigned int exponent:15; |
| 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:15; |
| unsigned int quiet_nan:1; |
| /* Together these comprise the mantissa. */ |
| unsigned int mantissa0:15; |
| unsigned int mantissa1:32; |
| unsigned int mantissa2:32; |
| unsigned int mantissa3:32; |
| #endif /* Big endian. */ |
| #if __BYTE_ORDER == __LITTLE_ENDIAN |
| /* Together these comprise the mantissa. */ |
| unsigned int mantissa3:32; |
| unsigned int mantissa2:32; |
| unsigned int mantissa1:32; |
| unsigned int mantissa0:15; |
| unsigned int quiet_nan:1; |
| unsigned int exponent:15; |
| unsigned int negative:1; |
| #endif /* Little endian. */ |
| } ieee_nan; |
| }; |
| |
| #define IEEE854_LONG_DOUBLE_BIAS 0x3fff /* Added to exponent. */ |
| |
| #elif LDBL_MANT_DIG == 64 |
| |
| union ieee854_long_double |
| { |
| long double d; |
| |
| /* This is the IEEE 854 double-extended-precision format. */ |
| struct |
| { |
| #if __BYTE_ORDER == __BIG_ENDIAN |
| unsigned int negative:1; |
| unsigned int exponent:15; |
| unsigned int empty:16; |
| unsigned int mantissa0:32; |
| unsigned int mantissa1:32; |
| #endif |
| #if __BYTE_ORDER == __LITTLE_ENDIAN |
| # if __FLOAT_WORD_ORDER == __BIG_ENDIAN |
| unsigned int exponent:15; |
| unsigned int negative:1; |
| unsigned int empty:16; |
| unsigned int mantissa0:32; |
| unsigned int mantissa1:32; |
| # else |
| unsigned int mantissa1:32; |
| unsigned int mantissa0:32; |
| unsigned int exponent:15; |
| unsigned int negative:1; |
| unsigned int empty:16; |
| # endif |
| #endif |
| } ieee; |
| |
| /* This is for NaNs in the IEEE 854 double-extended-precision format. */ |
| struct |
| { |
| #if __BYTE_ORDER == __BIG_ENDIAN |
| unsigned int negative:1; |
| unsigned int exponent:15; |
| unsigned int empty:16; |
| unsigned int one:1; |
| unsigned int quiet_nan:1; |
| unsigned int mantissa0:30; |
| unsigned int mantissa1:32; |
| #endif |
| #if __BYTE_ORDER == __LITTLE_ENDIAN |
| # if __FLOAT_WORD_ORDER == __BIG_ENDIAN |
| unsigned int exponent:15; |
| unsigned int negative:1; |
| unsigned int empty:16; |
| unsigned int mantissa0:30; |
| unsigned int quiet_nan:1; |
| unsigned int one:1; |
| unsigned int mantissa1:32; |
| # else |
| unsigned int mantissa1:32; |
| unsigned int mantissa0:30; |
| unsigned int quiet_nan:1; |
| unsigned int one:1; |
| unsigned int exponent:15; |
| unsigned int negative:1; |
| unsigned int empty:16; |
| # endif |
| #endif |
| } ieee_nan; |
| }; |
| |
| #define IEEE854_LONG_DOUBLE_BIAS 0x3fff |
| |
| #elif LDBL_MANT_DIG == 53 |
| |
| union ieee854_long_double |
| { |
| long 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 |
| # if __FLOAT_WORD_ORDER == __BIG_ENDIAN |
| unsigned int mantissa0:20; |
| unsigned int exponent:11; |
| unsigned int negative:1; |
| unsigned int mantissa1:32; |
| # else |
| /* Together these comprise the mantissa. */ |
| unsigned int mantissa1:32; |
| unsigned int mantissa0:20; |
| unsigned int exponent:11; |
| unsigned int negative:1; |
| # endif |
| #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 |
| # if __FLOAT_WORD_ORDER == __BIG_ENDIAN |
| unsigned int mantissa0:19; |
| unsigned int quiet_nan:1; |
| unsigned int exponent:11; |
| unsigned int negative:1; |
| 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 |
| #endif |
| } ieee_nan; |
| }; |
| |
| #define IEEE854_LONG_DOUBLE_BIAS 0x3ff /* Added to exponent. */ |
| |
| #endif /* LDBL_MANT_DIG == 53 */ |
| |
| __END_DECLS |
| |
| #endif /* ieee754.h */ |