For domain, overflow, and underflow errors, fma() correctlry raises exceptions. However errno is not set in any case. errno should be set (respectively EDOM, ERANGE, 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 2865 [details] test program Sample runs demonstrating the problem: $ /tmp/mt_fma inf 0 0 errno == 0 fetestexcept() says: FE_INVALID fma(inf,0.00000000000000000e+00,0.00000000000000000e+00)=nan 0 FE_INVALID nan $ /tmp/mt_fma dbl_max dbl_max 0 errno == 0 fetestexcept() says: FE_OVERFLOW FE_INEXACT fma(1.79769313486231571e+308,1.79769313486231571e+308,0.00000000000000000e+00)=inf 0 FE_OVERFLOW +inf $ /tmp/mt_fma dbl_min dbl_min 0 errno == 0 fetestexcept() says: FE_UNDERFLOW FE_INEXACT fma(2.22507385850720138e-308,2.22507385850720138e-308,0.00000000000000000e+00)=0.00000000000000000e+00 0 FE_UNDERFLOW +0
Confirmed with current sources on x86 and x86_64.
Still present in glibc 2.31 (tested on x86_64).