diff options
author | Andrew J. Schorr <aschorr@telemetry-investments.com> | 2016-08-01 15:15:41 -0400 |
---|---|---|
committer | Andrew J. Schorr <aschorr@telemetry-investments.com> | 2016-08-01 15:15:41 -0400 |
commit | 8518cb47f8315ea04290278e47cd44036edeaf35 (patch) | |
tree | abc3bdf6ec7eb0f9b2d0b307adcc89607f310378 | |
parent | 95bb49821598e92e05ebbbd6acea6fb9ffaa5b44 (diff) | |
download | egawk-8518cb47f8315ea04290278e47cd44036edeaf35.tar.gz egawk-8518cb47f8315ea04290278e47cd44036edeaf35.tar.bz2 egawk-8518cb47f8315ea04290278e47cd44036edeaf35.zip |
Minor MPFR fix to avoid potential hysteresis effects resulting in higher-than-needed precision.
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | mpfr.c | 12 |
2 files changed, 15 insertions, 2 deletions
@@ -1,5 +1,10 @@ 2016-08-01 Andrew J. Schorr <aschorr@telemetry-investments.com> + * mpfr.c (mpg_tofloat): Always set precision to avoid hysteresis effects + from previous calculations using the same temporary mpfr variables. + +2016-08-01 Andrew J. Schorr <aschorr@telemetry-investments.com> + * mpfr.c (default_prec): Add new static variable to show current PREC setting in effect. (init_mpfr, set_PREC): Save mpfr_set_default_prec argument in @@ -1218,9 +1218,17 @@ mpg_tofloat(mpfr_ptr mf, mpz_ptr mz) prec -= (size_t) mpz_scan1(mz, 0); /* least significant 1 bit index starting at 0 */ if (prec > MPFR_PREC_MAX) prec = MPFR_PREC_MAX; - if (prec > PRECISION_MIN) - mpfr_set_prec(mf, prec); + else if (prec < PRECISION_MIN) + prec = PRECISION_MIN; } + else + prec = PRECISION_MIN; + /* + * Always set the precision to avoid hysteresis, since do_mpfr_func + * may copy our precision. + */ + if (prec != mpfr_get_prec(mf)) + mpfr_set_prec(mf, prec); mpfr_set_z(mf, mz, ROUND_MODE); return mf; |