summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2002-04-12 14:29:49 +0000
committervlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2002-04-12 14:29:49 +0000
commitf0544a42b7d141e3615d51b228ccd8b12549eab4 (patch)
tree883fae979063a9bfdbb2b367ecc5aacbbda1453e
parentd4ab36cc814012a82534f9b7610628e631f3dfe7 (diff)
downloadmpfr-f0544a42b7d141e3615d51b228ccd8b12549eab4.tar.gz
mpfr_get_d* fixed.
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@1862 280ebfd0-de03-0410-8827-d642c229c3f4
-rw-r--r--BUGS2
-rw-r--r--get_d.c8
2 files changed, 6 insertions, 4 deletions
diff --git a/BUGS b/BUGS
index d7e6828e2..aa502a996 100644
--- a/BUGS
+++ b/BUGS
@@ -12,6 +12,4 @@ Knowns bugs:
* TMP_ALLOC problems in agm.c and sqrt.c. (Kevin Ryde, 05 March 2002)
-* get_d.c: still some problems with subnormals (the test fails).
-
* mpfr_set_d may give wrong results on some architectures.
diff --git a/get_d.c b/get_d.c
index 7d21b0605..cbb87059f 100644
--- a/get_d.c
+++ b/get_d.c
@@ -117,8 +117,12 @@ mpfr_get_d3 (mpfr_srcptr src, mp_exp_t e, mp_rnd_t rnd_mode)
if (e < -1073)
{
d = negative ?
- (rnd_mode == GMP_RNDD ? -DBL_MIN * DBL_EPSILON : -0.0) :
- (rnd_mode == GMP_RNDU ? DBL_MIN * DBL_EPSILON : 0.0);
+ (rnd_mode == GMP_RNDD ||
+ (rnd_mode == GMP_RNDN && mpfr_cmp_si_2exp(src, -1, -1075) < 0)
+ ? -DBL_MIN * DBL_EPSILON : -0.0) :
+ (rnd_mode == GMP_RNDU ||
+ (rnd_mode == GMP_RNDN && mpfr_cmp_si_2exp(src, 1, -1075) > 0)
+ ? DBL_MIN * DBL_EPSILON : 0.0);
}
/* the largest normalized number is 2^1024*(1-2^(-53))=0.111...111e1024 */
else if (e > 1024)