Sources Bugzilla – Bug 6799
nextafter() and nexttoward() doen't set errno on overflow/underflow errors
Last modified: 2012-03-01 16:58:53 UTC
On overflow and underflow, nextafter() and nexttoward() correctly raise an exception. But errno is not set for these cases. errno should be set to ERANGE. Background: On error, many glibc math functions both set errno and raise an exception (fetestexcept(3)). For example, the following function all do this: acos(), asin(), cosh(), sinh(), acosh(), asinh(), exp(), exp2(), ldexp(), log(), log10(), log2(). However, there is much inconsistency. Some functions raise an exception, but don't set errno. Some functions set errno for some errors, but not others. A few set errno, but don't raise an exception. This series of bug reports documents deviations from what I consider the ideal: all functions should BOTH set errno AND raise an exception for all errors. All of these reports relate to tests on glibc 2.8 (as provided by SUSE 11.0).
Created attachment 2863 [details] test program
Created attachment 2864 [details] test program
Sample runs demonstrating the problem: $ /tmp/mt_nextafter dbl_max inf errno == 0 fetestexcept() says: FE_OVERFLOW FE_INEXACT nextafter(1.79769313486231571e+308,inf)=inf 0 FE_OVERFLOW +inf $ /tmp/mt_nextafter dbl_min 0 errno == 0 fetestexcept() says: FE_UNDERFLOW FE_INEXACT nextafter(2.22507385850720138e-308,0.00000000000000000e+00)=2.22507385850720089e-308 0 FE_UNDERFLOW subnormal $ /tmp/mt_nexttoward dbl_max inf errno == 0 fetestexcept() says: FE_OVERFLOW FE_INEXACT nexttoward(1.79769313486231571e+308,inf)=inf 0 FE_OVERFLOW +inf $ /tmp/mt_nexttoward dbl_min 0 errno == 0 fetestexcept() says: FE_UNDERFLOW FE_INEXACT nexttoward(2.22507385850720138e-308,0.000000000000000000000000000000000000e+00)=2.22507385850720089e-308 0 FE_UNDERFLOW subnormal
Confirmed with current sources on x86 and x86_64.