From fc72af500c2281433b2e65020b29c28dbfa8037f Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Tue, 23 Jul 2024 10:39:28 +0200 Subject: [PATCH] strtod, strtold: Set errno upon gradual underflow. * lib/strtod.c (scale_radix_exp): If the result is a denormalized number, set errno to ERANGE. --- ChangeLog | 6 ++++++ lib/strtod.c | 13 +++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7484d325ea..0b91b66392 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2024-07-23 Bruno Haible + + strtod, strtold: Set errno upon gradual underflow. + * lib/strtod.c (scale_radix_exp): If the result is a denormalized + number, set errno to ERANGE. + 2024-07-21 Bruno Haible bootstrap: Avoid failure when gnulib-tool removed gettext.m4. diff --git a/lib/strtod.c b/lib/strtod.c index 62e2b870fc..7a8136b201 100644 --- a/lib/strtod.c +++ b/lib/strtod.c @@ -141,11 +141,20 @@ scale_radix_exp (DOUBLE x, int radix, long int exponent) { if (e < 0) { - while (e++ != 0) + for (;;) { + if (e++ == 0) + { + if (r < MIN && r > -MIN) + /* Gradual underflow, resulting in a denormalized + number. */ + errno = ERANGE; + break; + } r /= radix; - if (r == 0 && x != 0) + if (r == 0) { + /* Flush-to-zero underflow. */ errno = ERANGE; break; } -- 2.39.5