aboutsummaryrefslogtreecommitdiff
path: root/stdlib/strtod_l.c
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/strtod_l.c')
-rw-r--r--stdlib/strtod_l.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/stdlib/strtod_l.c b/stdlib/strtod_l.c
index c39bb35b09..e13ab1e7e1 100644
--- a/stdlib/strtod_l.c
+++ b/stdlib/strtod_l.c
@@ -1189,7 +1189,16 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc)
if (__glibc_unlikely (exponent > MAX_10_EXP + 1 - (intmax_t) int_no))
return overflow_value (negative);
- if (__glibc_unlikely (exponent < MIN_10_EXP - (DIG + 1)))
+ /* 10^(MIN_10_EXP-1) is not normal. Thus, 10^(MIN_10_EXP-1) /
+ 2^MANT_DIG is below half the least subnormal, so anything with a
+ base-10 exponent less than the base-10 exponent (which is
+ MIN_10_EXP - 1 - ceil(MANT_DIG*log10(2))) of that value
+ underflows. DIG is floor((MANT_DIG-1)log10(2)), so an exponent
+ below MIN_10_EXP - (DIG + 3) underflows. But EXPONENT is
+ actually an exponent multiplied only by a fractional part, not an
+ integer part, so an exponent below MIN_10_EXP - (DIG + 2)
+ underflows. */
+ if (__glibc_unlikely (exponent < MIN_10_EXP - (DIG + 2)))
return underflow_value (negative);
if (int_no > 0)
@@ -1356,7 +1365,7 @@ ____STRTOF_INTERNAL (nptr, endptr, group, loc)
assert (dig_no > int_no
&& exponent <= 0
- && exponent >= MIN_10_EXP - (DIG + 1));
+ && exponent >= MIN_10_EXP - (DIG + 2));
/* We need to compute MANT_DIG - BITS fractional bits that lie
within the mantissa of the result, the following bit for