diff options
Diffstat (limited to 'tests/tsqrt.c')
-rw-r--r-- | tests/tsqrt.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/tests/tsqrt.c b/tests/tsqrt.c index 17d05c3..15f9888 100644 --- a/tests/tsqrt.c +++ b/tests/tsqrt.c @@ -28,11 +28,45 @@ along with this program. If not, see http://www.gnu.org/licenses/ . #include "data_check.tpl" #include "tgeneric.tpl" +/* check with reduced exponent range */ +static void +bug20200207 (void) +{ + mpfr_exp_t emin = mpfr_get_emin (); + mpfr_exp_t emax = mpfr_get_emax (); + mpc_t x, z, zr; + + mpfr_set_emin (-148); + mpfr_set_emax (128); + mpc_init2 (x, 24); + mpc_init2 (z, 24); + mpc_init2 (zr, 24); + mpfr_set_d (mpc_realref (x), -1.89432151320234e24, MPFR_RNDN); + mpfr_set_d (mpc_imagref (x), -1.06397209600000e9, MPFR_RNDN); + mpc_sqrt (z, x, MPC_RNDNN); + /* square root is 0.00038652126908433 - 1.37634353022868e12*I */ + mpfr_set_d (mpc_realref (zr), 0.00038652126908433, MPFR_RNDN); + mpfr_set_d (mpc_imagref (zr), -1.37634353022868e12, MPFR_RNDN); + if (mpc_cmp (z, zr)) + { + printf ("Incorrect square root with reduced exponent range:\n"); + mpfr_printf ("Expected (%Re,%Re)\n", mpc_realref (zr), mpc_imagref (zr)); + mpfr_printf ("Got (%Re,%Re)\n", mpc_realref (z), mpc_imagref (z)); + exit (1); + } + mpc_clear (x); + mpc_clear (z); + mpc_clear (zr); + mpfr_set_emin (emin); + mpfr_set_emax (emax); +} + int main (void) { test_start (); + bug20200207 (); data_check_template ("sqrt.dsc", "sqrt.dat"); tgeneric_template ("sqrt.dsc", 2, 1024, 7, 256); |