diff options
author | Jakub Jelinek <jakub@redhat.com> | 2005-01-06 14:57:16 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2005-01-06 14:57:16 +0000 |
commit | 0ecfa2580d1aedb744deb5af1b60f92c69b9e9e0 (patch) | |
tree | 1ef0d0dc09dba23037800d5f3794a77d9b45554f /misc | |
parent | e4f5d077e9190f57abd49684bd7afcf4325bd348 (diff) | |
download | glibc-0ecfa2580d1aedb744deb5af1b60f92c69b9e9e0.tar.gz glibc-0ecfa2580d1aedb744deb5af1b60f92c69b9e9e0.tar.xz glibc-0ecfa2580d1aedb744deb5af1b60f92c69b9e9e0.zip |
Updated to fedora-glibc-20050106T1443
Diffstat (limited to 'misc')
-rw-r--r-- | misc/efgcvt_r.c | 25 | ||||
-rw-r--r-- | misc/qefgcvt_r.c | 12 | ||||
-rw-r--r-- | misc/tst-efgcvt.c | 7 |
3 files changed, 42 insertions, 2 deletions
diff --git a/misc/efgcvt_r.c b/misc/efgcvt_r.c index ac2a5c45bf..69cca9038f 100644 --- a/misc/efgcvt_r.c +++ b/misc/efgcvt_r.c @@ -1,5 +1,5 @@ /* Compatibility functions for floating point formatting, reentrant versions. - Copyright (C) 1995,96,97,98,99,2000,01,02 Free Software Foundation, Inc. + Copyright (C) 1995,96,97,98,99,2000,01,02,04 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -31,6 +31,7 @@ # define FUNC_PREFIX # define FLOAT_FMT_FLAG # define FLOAT_NAME_EXT +# define FLOAT_MIN_10_EXP DBL_MIN_10_EXP # if DBL_MANT_DIG == 53 # define NDIGIT_MAX 17 # elif DBL_MANT_DIG == 24 @@ -43,6 +44,17 @@ # error "NDIGIT_MAX must be precomputed" # define NDIGIT_MAX (lrint (ceil (M_LN2 / M_LN10 * DBL_MANT_DIG + 1.0))) # endif +# if DBL_MIN_10_EXP == -37 +# define FLOAT_MIN_10_NORM 1.0e-37 +# elif DBL_MIN_10_EXP == -307 +# define FLOAT_MIN_10_NORM 1.0e-307 +# elif DBL_MIN_10_EXP == -4931 +# define FLOAT_MIN_10_NORM 1.0e-4931 +# else +/* libc can't depend on libm. */ +# error "FLOAT_MIN_10_NORM must be precomputed" +# define FLOAT_MIN_10_NORM exp10 (DBL_MIN_10_EXP) +# endif #endif #define APPEND(a, b) APPEND2 (a, b) @@ -171,6 +183,17 @@ APPEND (FUNC_PREFIX, ecvt_r) (value, ndigit, decpt, sign, buf, len) d = -value; else d = value; + /* For denormalized numbers the d < 1.0 case below won't work, + as f can overflow to +Inf. */ + if (d < FLOAT_MIN_10_NORM) + { + value /= FLOAT_MIN_10_NORM; + if (value < 0.0) + d = -value; + else + d = value; + exponent += FLOAT_MIN_10_EXP; + } if (d < 1.0) { do diff --git a/misc/qefgcvt_r.c b/misc/qefgcvt_r.c index 66cc049ec8..d5b2a799b3 100644 --- a/misc/qefgcvt_r.c +++ b/misc/qefgcvt_r.c @@ -24,6 +24,7 @@ #define FUNC_PREFIX q #define FLOAT_FMT_FLAG "L" #define FLOAT_NAME_EXT l +#define FLOAT_MIN_10_EXP LDBL_MIN_10_EXP #if LDBL_MANT_DIG == 64 # define NDIGIT_MAX 21 #elif LDBL_MANT_DIG == 53 @@ -40,5 +41,16 @@ # error "NDIGIT_MAX must be precomputed" # define NDIGIT_MAX (lrint (ceil (M_LN2 / M_LN10 * LDBL_MANT_DIG + 1.0))) #endif +#if LDBL_MIN_10_EXP == -37 +# define FLOAT_MIN_10_NORM 1.0e-37L +#elif LDBL_MIN_10_EXP == -307 +# define FLOAT_MIN_10_NORM 1.0e-307L +#elif LDBL_MIN_10_EXP == -4931 +# define FLOAT_MIN_10_NORM 1.0e-4931L +#else +/* libc can't depend on libm. */ +# error "FLOAT_MIN_10_NORM must be precomputed" +# define FLOAT_MIN_10_NORM exp10l (LDBL_MIN_10_EXP) +#endif #include "efgcvt_r.c" diff --git a/misc/tst-efgcvt.c b/misc/tst-efgcvt.c index 91e5cf929e..30ab0f17a0 100644 --- a/misc/tst-efgcvt.c +++ b/misc/tst-efgcvt.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1998, 1999, 2000, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -20,6 +20,7 @@ # define _GNU_SOURCE 1 #endif +#include <float.h> #include <math.h> #include <stdio.h> #include <stdlib.h> @@ -59,6 +60,10 @@ static testcase ecvt_tests[] = { 123.01, -4, 3, "" }, { 126.71, -4, 3, "" }, { 0.0, 4, 1, "0000" }, +#if DBL_MANT_DIG == 53 + { 0x1p-1074, 3, -323, "494" }, + { -0x1p-1074, 3, -323, "494" }, +#endif /* -1.0 is end marker. */ { -1.0, 0, 0, "" } }; |