diff options
author | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2009-09-15 11:37:40 +0000 |
---|---|---|
committer | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2009-09-15 11:37:40 +0000 |
commit | 40def89a5d2c97509a526582e0bdc747beceb386 (patch) | |
tree | 81a23b35a99508ba009d28b58a827920988970bb /ieee_floats.h | |
parent | 8b83b107bde01e54a6f33841130e07181e2b53bf (diff) | |
download | mpfr-40def89a5d2c97509a526582e0bdc747beceb386.tar.gz |
added new functions mpfr_set_binary32 and mpfr_get_binary32
fixed bug in mpfr_get_d and mpfr_get_decimal64 for RNDA
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@6424 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'ieee_floats.h')
-rw-r--r-- | ieee_floats.h | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/ieee_floats.h b/ieee_floats.h new file mode 100644 index 000000000..08400c522 --- /dev/null +++ b/ieee_floats.h @@ -0,0 +1,76 @@ +/* auxiliary data to generate special IEEE floats (NaN, +Inf, -Inf) + +Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +Contributed by the Arenaire and Cacao projects, INRIA. + +This file is part of the GNU MPFR Library. + +The GNU MPFR 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 3 of the License, or (at your +option) any later version. + +The GNU MPFR 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 MPFR Library; see the file COPYING.LESSER. If not, see +http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., +51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ + +/* "double" NaN and infinities are written as explicit bytes to be sure of + getting what we want, and to be sure of not depending on libm. + + Could use 4-byte "float" values and let the code convert them, but it + seems more direct to give exactly what we want. Certainly for gcc 3.0.2 + on alphaev56-unknown-freebsd4.3 the NaN must be 8-bytes, since that + compiler+system was seen incorrectly converting from a "float" NaN. */ + +#if _GMP_IEEE_FLOATS + +/* The "d" field guarantees alignment to a suitable boundary for a double. + Could use a union instead, if we checked the compiler supports union + initializers. */ +struct dbl_bytes { + unsigned char b[8]; + double d; +}; + +#define MPFR_DBL_INFP (* (const double *) dbl_infp.b) +#define MPFR_DBL_INFM (* (const double *) dbl_infm.b) +#define MPFR_DBL_NAN (* (const double *) dbl_nan.b) + +#if HAVE_DOUBLE_IEEE_LITTLE_ENDIAN +static const struct dbl_bytes dbl_infp = + { { 0, 0, 0, 0, 0, 0, 0xF0, 0x7F }, 0.0 }; +static const struct dbl_bytes dbl_infm = + { { 0, 0, 0, 0, 0, 0, 0xF0, 0xFF }, 0.0 }; +static const struct dbl_bytes dbl_nan = + { { 0, 0, 0, 0, 0, 0, 0xF8, 0x7F }, 0.0 }; +#endif +#if HAVE_DOUBLE_IEEE_LITTLE_SWAPPED +static const struct dbl_bytes dbl_infp = + { { 0, 0, 0xF0, 0x7F, 0, 0, 0, 0 }, 0.0 }; +static const struct dbl_bytes dbl_infm = + { { 0, 0, 0xF0, 0xFF, 0, 0, 0, 0 }, 0.0 }; +static const struct dbl_bytes dbl_nan = + { { 0, 0, 0xF8, 0x7F, 0, 0, 0, 0 }, 0.0 }; +#endif +#if HAVE_DOUBLE_IEEE_BIG_ENDIAN +static const struct dbl_bytes dbl_infp = + { { 0x7F, 0xF0, 0, 0, 0, 0, 0, 0 }, 0.0 }; +static const struct dbl_bytes dbl_infm = + { { 0xFF, 0xF0, 0, 0, 0, 0, 0, 0 }, 0.0 }; +static const struct dbl_bytes dbl_nan = + { { 0x7F, 0xF8, 0, 0, 0, 0, 0, 0 }, 0.0 }; +#endif + +#else /* _GMP_IEEE_FLOATS */ + +#define MPFR_DBL_INFP DBL_POS_INF +#define MPFR_DBL_INFM DBL_NEG_INF +#define MPFR_DBL_NAN DBL_NAN + +#endif /* _GMP_IEEE_FLOATS */ |