summaryrefslogtreecommitdiff
path: root/set_ld.c
diff options
context:
space:
mode:
authorpelissip <pelissip@280ebfd0-de03-0410-8827-d642c229c3f4>2004-12-17 11:13:53 +0000
committerpelissip <pelissip@280ebfd0-de03-0410-8827-d642c229c3f4>2004-12-17 11:13:53 +0000
commit20b84c32281fdbce91e97ed6977d4140e30e8078 (patch)
tree4322cca1061a07378af9fdc6f28b57455dec305c /set_ld.c
parent633ff961963dc69d40209c2066d39de37ba23fcc (diff)
downloadmpfr-20b84c32281fdbce91e97ed6977d4140e30e8078.tar.gz
Fix problem with long double with ICC (Wrong x86 processor flag).
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@3148 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'set_ld.c')
-rw-r--r--set_ld.c35
1 files changed, 19 insertions, 16 deletions
diff --git a/set_ld.c b/set_ld.c
index 2c89acd0c..dbd63bf90 100644
--- a/set_ld.c
+++ b/set_ld.c
@@ -56,20 +56,19 @@ mpfr_set_ld (mpfr_ptr r, long double d, mp_rnd_t rnd_mode)
mpfr_set_inf (r, 1);
return 0;
}
-
- if (d < -MPFR_LDBL_MAX)
+ else if (d < -MPFR_LDBL_MAX)
{
mpfr_set_inf (r, -1);
return 0;
}
-
- if (d == 0.0)
+ else if (d == 0.0)
return mpfr_set_d (r, (double) d, rnd_mode);
mpfr_init2 (t, MPFR_LDBL_MANT_DIG);
mpfr_init2 (u, IEEE_DBL_MANT_DIG);
- mpfr_set_ui (t, 0, GMP_RNDN);
+ MPFR_SET_ZERO (t);
MPFR_SAVE_EXPO_MARK (expo);
+
while (d != (long double) 0.0)
{
if ((d > (long double) DBL_MAX) || ((-d) > (long double) DBL_MAX))
@@ -84,6 +83,7 @@ mpfr_set_ld (mpfr_ptr r, long double d, mp_rnd_t rnd_mode)
div11 = div10 * div10; /* 2^(2^11) */
div12 = div11 * div11; /* 2^(2^12) */
div13 = div12 * div12; /* 2^(2^13) */
+#if 1
if (ABS(d) >= div13)
{
d = d / div13; /* exact */
@@ -111,14 +111,20 @@ mpfr_set_ld (mpfr_ptr r, long double d, mp_rnd_t rnd_mode)
d = d / div9; /* exact */
shift_exp += 512;
}
- mpfr_set_ui (u, 0, GMP_RNDZ);
+#else
+ while (ABS(d) >= (long double) 2.0) {
+ d /= 2.0;
+ shift_exp ++;
+ }
+#endif
+ MPFR_SET_ZERO (u);
}
else
{
/* since -DBL_MAX <= d <= DBL_MAX, the cast to double should not
overflow here */
inexact = mpfr_set_d (u, (double) d, GMP_RNDN);
- MPFR_ASSERTD(inexact == 0);
+ MPFR_ASSERTD (inexact == 0);
if (MPFR_IS_ZERO (u) && (d != (long double) 0.0)) /* underflow */
{
long double div10, div11, div12, div13;
@@ -146,19 +152,16 @@ mpfr_set_ld (mpfr_ptr r, long double d, mp_rnd_t rnd_mode)
d = d / div10; /* exact */
shift_exp -= 1024;
}
- }
+ }
+ mpfr_add (t, t, u, GMP_RNDN); /* exact */
+ if (!mpfr_number_p (t))
+ break;
+ d = d - (long double) mpfr_get_d1 (u); /* exact */
}
- mpfr_add (t, t, u, GMP_RNDN); /* exact */
- if (!mpfr_number_p (t))
- break;
- d = d - (long double) mpfr_get_d1 (u); /* exact */
}
/* now t is exactly the input value d */
inexact = mpfr_set (r, t, rnd_mode);
- if (shift_exp > 0)
- inexact2 = mpfr_mul_2exp (r, r, shift_exp, rnd_mode);
- else if (shift_exp < 0)
- inexact2 = mpfr_div_2exp (r, r, -shift_exp, rnd_mode);
+ inexact2 = mpfr_mul_2si (r, r, shift_exp, rnd_mode);
if (inexact2) /* overflow */
inexact = inexact2;
mpfr_clear (t);