Sources Bugzilla – Bug 6787
exp10() does not consistently set errno
Last modified: 2012-02-29 22:22:37 UTC
exp10() correctly raises exceptions for overflow and underflow. However, errno is only set to ERANGE for the overflow case. For underflow, it is not set. It should also be set to ERANGE in the latter case. Note also that exp10() is inconsistent with exp2() and exp(), both of which always set errno for bother underflow and overflow. 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 2852 [details] test program Sample run showing problem. Note that errno is set for overflow, but not for underflow. $ /tmp/mt_exp10 -- -1e5 errno == 0 fetestexcept() says: FE_UNDERFLOW FE_INEXACT exp10(-1.00000000000000000e+05)=0.00000000000000000e+00 0 FE_UNDERFLOW +0 $ /tmp/mt_exp10 -- 1e5 errno == ERANGE fetestexcept() says: FE_OVERFLOW FE_INEXACT exp10(1.00000000000000000e+05)=inf ERANGE FE_OVERFLOW +inf
Confirmed with current sources on x86 and x86_64 - with the addition that on x86_64, the UNDERFLOW exception doesn't get raised on underflow.