Sources Bugzilla – Bug 6810
tgamma() does not set errno for underflow error
Last modified: 2012-03-01 23:29:18 UTC
tgamma() correctly sets errno and raises an exception for an overflow error. However, for an underflow error, it only raises an exception -- errno is not set; errno should be set to ERANGE for this case. 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 2882 [details] test program Sample runs demonstrating the problem: $ /tmp/mt_tgamma 1e3 errno == ERANGE fetestexcept() says: FE_OVERFLOW FE_INEXACT tgamma(1.00000000000000000e+03)=inf ERANGE FE_OVERFLOW +inf $ /tmp/mt_tgamma -- -100000.5 errno == 0 fetestexcept() says: FE_UNDERFLOW FE_INEXACT tgamma(-1.00000500000000000e+05)=-0.00000000000000000e+00 0 FE_UNDERFLOW -0
Confirmed for current sources on both x86 and x86_64 - with the addition that on x86_64, the underflow exception for -100000.5 is also missing (it's present on x86).