summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2009-10-13 06:37:15 +0000
committerzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2009-10-13 06:37:15 +0000
commit27b6d7edab02ec27ef3ccf36b7ba1c2b4920c85c (patch)
tree2875d2e730541ab836539d140a540c65421ae024
parentc36b71dfaf2b70aa2c958657ee3746eb0bc49bd9 (diff)
downloadmpfr-27b6d7edab02ec27ef3ccf36b7ba1c2b4920c85c.tar.gz
[li2.c] fixed bug when x is near 0
[tli2.c] added new test git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@6512 280ebfd0-de03-0410-8827-d642c229c3f4
-rw-r--r--li2.c3
-rw-r--r--tests/tli2.c30
2 files changed, 33 insertions, 0 deletions
diff --git a/li2.c b/li2.c
index 4f0fa54a4..b65d6ab25 100644
--- a/li2.c
+++ b/li2.c
@@ -276,6 +276,8 @@ mpfr_li2 (mpfr_ptr y, mpfr_srcptr x, mpfr_rnd_t rnd_mode)
{
mpfr_ui_sub (u, 1, x, MPFR_RNDN);
mpfr_log (u, u, MPFR_RNDU);
+ if (MPFR_IS_ZERO(u))
+ goto next_m;
mpfr_neg (u, u, MPFR_RNDN); /* u = -log(1-x) */
expo_l = MPFR_GET_EXP (u);
k = li2_series (s, u, MPFR_RNDU);
@@ -292,6 +294,7 @@ mpfr_li2 (mpfr_ptr y, mpfr_srcptr x, mpfr_rnd_t rnd_mode)
if (MPFR_CAN_ROUND (s, (mp_exp_t) m - err, yp, rnd_mode))
break;
+ next_m:
MPFR_ZIV_NEXT (loop, m);
mpfr_set_prec (u, m);
mpfr_set_prec (s, m);
diff --git a/tests/tli2.c b/tests/tli2.c
index cfc159758..f7f7ff4da 100644
--- a/tests/tli2.c
+++ b/tests/tli2.c
@@ -147,11 +147,41 @@ normal (void)
mpfr_clear (y);
}
+static void
+bug20091013 (void)
+{
+ mpfr_t x, y;
+ int inex;
+
+ mpfr_init2 (x, 17);
+ mpfr_init2 (y, 2);
+ mpfr_set_str_binary (x, "0.10000000000000000E-16");
+ inex = mpfr_li2 (y, x, MPFR_RNDN);
+ if (mpfr_cmp_ui_2exp (y, 1, -17) != 0)
+ {
+ printf ("Error in bug20091013()\n");
+ printf ("expected 2^(-17)\n");
+ printf ("got ");
+ mpfr_dump (y);
+ exit (1);
+ }
+ if (inex >= 0)
+ {
+ printf ("Error in bug20091013()\n");
+ printf ("expected negative ternary value, got %d\n", inex);
+ exit (1);
+ }
+ mpfr_clear (x);
+ mpfr_clear (y);
+}
+
int
main (int argc, char *argv[])
{
tests_start_mpfr ();
+ bug20091013 ();
+
special ();
normal ();