On a domain error, lrint() and llrint() correctly raise an exception, but do not set errno. They should set errno to EDOM. (The same problem afflicts lround(), llround(), see http://sourceware.org/bugzilla/show_bug.cgi?id=6797) 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 2861 [details] test program
Created attachment 2862 [details] test program Sample runs showing problem: $ /tmp/mt_lrint inf errno == 0 fetestexcept() says: FE_INVALID lrint(inf)=-2147483648 0 FE_INVALID normal $ /tmp/mt_llrint inf errno == 0 fetestexcept() says: FE_INVALID llrint(inf)=-9223372036854775808 0 FE_INVALID normal $ /tmp/mt_lrint nan errno == 0 fetestexcept() says: FE_INVALID lrint(nan)=-2147483648 0 FE_INVALID normal $ /tmp/mt_llrint nan errno == 0 fetestexcept() says: FE_INVALID llrint(nan)=-9223372036854775808 0 FE_INVALID normal
Confirmed with current sources on x86 and x86_64.