From: Bruno Haible Date: Tue, 23 Jul 2024 08:39:28 +0000 (+0200) Subject: strtof, strtod, strtold: Set errno upon gradual underflow. X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=6be595445812bbcdf5d11c3f439a3eb3dbd7069a;p=gnulib.git strtof, strtod, strtold: Set errno upon gradual underflow. * lib/strtod.c (scale_radix_exp): If the result is a denormalized number, set errno to ERANGE. --- diff --git a/ChangeLog b/ChangeLog index cf20d60b76..90fdb4dee0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2024-07-23 Bruno Haible + + strtof, 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-22 Collin Funk sys_socket tests: Improve tests for macro definitions. diff --git a/lib/strtod.c b/lib/strtod.c index e218a46f71..8847cae940 100644 --- a/lib/strtod.c +++ b/lib/strtod.c @@ -158,11 +158,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; }