Sources Bugzilla – Bug 6796
fdim() does not set errno on overflow
Last modified: 2012-03-01 16:43:19 UTC
On overflow, fdim() correctly raises an exception, but does not set errno. 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 2858 [details] test program Sample run demonstrating the problem $ /tmp/mt_fdim -- dbl_max -dbl_max errno == 0 fetestexcept() says: FE_OVERFLOW FE_INEXACT fdim(1.79769313486231571e+308,-1.79769313486231571e+308)=inf 0 FE_OVERFLOW +inf
Confirmed with current sources on x86. x86_64 sets errno correctly.