diff options
Diffstat (limited to 'Build/source/libs/mpfr/mpfr-src/src/get_d.c')
-rw-r--r-- | Build/source/libs/mpfr/mpfr-src/src/get_d.c | 52 |
1 files changed, 26 insertions, 26 deletions
diff --git a/Build/source/libs/mpfr/mpfr-src/src/get_d.c b/Build/source/libs/mpfr/mpfr-src/src/get_d.c index 5b4d85ff97c..8721c023543 100644 --- a/Build/source/libs/mpfr/mpfr-src/src/get_d.c +++ b/Build/source/libs/mpfr/mpfr-src/src/get_d.c @@ -1,7 +1,7 @@ /* mpfr_get_d, mpfr_get_d_2exp -- convert a multiple precision floating-point number to a machine double precision float -Copyright 1999-2019 Free Software Foundation, Inc. +Copyright 1999-2020 Free Software Foundation, Inc. Contributed by the AriC and Caramba projects, INRIA. This file is part of the GNU MPFR Library. @@ -89,7 +89,6 @@ mpfr_get_d (mpfr_srcptr src, mpfr_rnd_t rnd_mode) else { int nbits; - mp_size_t np, i; mp_limb_t tp[ MPFR_LIMBS_PER_DOUBLE ]; int carry; @@ -97,17 +96,22 @@ mpfr_get_d (mpfr_srcptr src, mpfr_rnd_t rnd_mode) if (MPFR_UNLIKELY (e < -1021)) /*In the subnormal case, compute the exact number of significant bits*/ { - nbits += (1021 + e); - MPFR_ASSERTD (nbits >= 1); + nbits += 1021 + e; + MPFR_ASSERTD (1 <= nbits && nbits < IEEE_DBL_MANT_DIG); } - np = MPFR_PREC2LIMBS (nbits); - MPFR_ASSERTD ( np <= MPFR_LIMBS_PER_DOUBLE ); carry = mpfr_round_raw_4 (tp, MPFR_MANT(src), MPFR_PREC(src), negative, nbits, rnd_mode); if (MPFR_UNLIKELY(carry)) d = 1.0; else { +#if MPFR_LIMBS_PER_DOUBLE == 1 + d = (double) tp[0] / MP_BASE_AS_DOUBLE; +#else + mp_size_t np, i; + MPFR_ASSERTD (nbits <= IEEE_DBL_MANT_DIG); + np = MPFR_PREC2LIMBS (nbits); + MPFR_ASSERTD ( np <= MPFR_LIMBS_PER_DOUBLE ); /* The following computations are exact thanks to the previous mpfr_round_raw. */ d = (double) tp[0] / MP_BASE_AS_DOUBLE; @@ -115,6 +119,7 @@ mpfr_get_d (mpfr_srcptr src, mpfr_rnd_t rnd_mode) d = (d + tp[i]) / MP_BASE_AS_DOUBLE; /* d is the mantissa (between 1/2 and 1) of the argument rounded to 53 bits */ +#endif } d = mpfr_scale2 (d, e); if (negative) @@ -154,28 +159,23 @@ mpfr_get_d_2exp (long *expptr, mpfr_srcptr src, mpfr_rnd_t rnd_mode) MPFR_ALIAS (tmp, src, MPFR_SIGN (src), 0); ret = mpfr_get_d (tmp, rnd_mode); - if (MPFR_IS_PURE_FP(src)) - { - exp = MPFR_GET_EXP (src); - - /* rounding can give 1.0, adjust back to 0.5 <= abs(ret) < 1.0 */ - if (ret == 1.0) - { - ret = 0.5; - exp++; - } - else if (ret == -1.0) - { - ret = -0.5; - exp++; - } + exp = MPFR_GET_EXP (src); - MPFR_ASSERTN ((ret >= 0.5 && ret < 1.0) - || (ret <= -0.5 && ret > -1.0)); - MPFR_ASSERTN (exp >= LONG_MIN && exp <= LONG_MAX); + /* rounding can give 1.0, adjust back to 0.5 <= abs(ret) < 1.0 */ + if (ret == 1.0) + { + ret = 0.5; + exp++; } - else - exp = 0; + else if (ret == -1.0) + { + ret = -0.5; + exp++; + } + + MPFR_ASSERTN ((ret >= 0.5 && ret < 1.0) + || (ret <= -0.5 && ret > -1.0)); + MPFR_ASSERTN (exp >= LONG_MIN && exp <= LONG_MAX); *expptr = exp; return ret; |