Bug 6783

Summary: remainder() inconsistently sets errno on domain error
Product: glibc Reporter: Michael Kerrisk <mtk.manpages>
Component: mathAssignee: Andreas Jaeger <aj>
Severity: normal CC: drepper.fsp, glibc-bugs
Priority: P2 Flags: fweimer: security-
Version: unspecified   
Target Milestone: ---   
Host: Target:
Build: Last reconfirmed:
Attachments: test program

Description Michael Kerrisk 2008-07-30 12:22:50 UTC
The calls remainder(x, 0) and remainder(inf, y) should both result in a domain

For both of these calls, an invalid exception is correctly raised.

However, errno is not set consistently.  remainder(x, 0) does (correctly) set
errno to EDOM.  However, remainder(inf, y) does not set errno; it should do so.

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).
Comment 1 Michael Kerrisk 2008-07-31 08:42:58 UTC
Created attachment 2848 [details]
test program

sample runs showing problem.  Note that EDOM is set in one case, but not the

$ /tmp/mt_remainder -- inf 1
errno == 0
fetestexcept() says:  FE_INVALID

$ /tmp/mt_remainder -- 1 0
errno == EDOM
fetestexcept() says:  FE_INVALID
Comment 2 Andreas Jaeger 2011-09-29 09:55:56 UTC
Thanks for the report. I just send a patch to the libc-alpha mailing list to fix this.
Comment 3 Ulrich Drepper 2011-10-07 19:17:25 UTC
I checked in the patch.
Comment 4 Michael Kerrisk 2016-11-19 08:47:16 UTC
Documented for man-pages-4.09.