Date: Thu, 8 Jan 2004 01:30:17 -0800 (PST) From: Bruce Evans <bde@zeta.org.au> To: standards@FreeBSD.org Subject: Re: i386/105: Distributed libm (msun) has non-standard error handling. Message-ID: <200401080930.i089UHZL024798@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR i386/105; it has been noted by GNATS. From: Bruce Evans <bde@zeta.org.au> To: Ryan Sommers <ryans@gamersimpact.com> Cc: freebsd-gnats-submit@freebsd.org Subject: Re: i386/105: Distributed libm (msun) has non-standard error handling. Date: Thu, 8 Jan 2004 20:28:06 +1100 (EST) On Wed, 7 Jan 2004, Ryan Sommers wrote: > It looks like this problem has since been resolved. I believe this PR > can be closed. > > ryans@lilshadow(~/src):cat test.c > #include <stdio.h> > #include <math.h> > > main () > { > printf ("acos = %g\n", acos (-2.0)); > printf ("pow = %g\n", pow(3, 1000001)); > } > ryans@lilshadow(~/src):gcc -lm -o test test.c > ryans@lilshadow(~/src):./test > acos = nan > pow = inf Many aspects of this are still open: - adding "assert(errno == EDOM);" would show that error handling does not conform to C90 (or the man page for at least the VAX and Tahoe cases; the handing of domain errors for other cases seems to be undocumented in the man pages). - adding "#include <ieeefp.h> ... fpsetmask(fpgetmask() | FP_X_INV)" would show that the oringal problem still exists, unless fpsetmask() is permitted to break the operation of standard functions. Using fpsetmask() gives undefined behaviour by taking the program out of C90 abd by fpsetmask()'s docmentation not being detailed enough to define the behaviour. C99 defines the effect of the feset*() family on library functions in detail. I don't completely understand this, and C99 avoids the problem by not providing a way to unmask traps for FP exceptions. This is mainly a documentation problem. Math functions should eventually do the the following: - not support C90 (they never did) - conform to C99 with the <mumble> math extensions. Take the option to never set errno for math functions. - have a nonstandard fesetmask() function whose use breaks C99 conformance in documented ways (should it affect math functions or only application code?). - conform to POSIX.1-2001. Set math_errhandling to MATH_ERREXCEPT to indicate that setting errno is not done. - document the above, and don't document VAX and Tahoe error handling. - document "raise"ing of FP exceptions more clearly than POSIX (does it call raise() or raise a SIGFPE? It had better not by default, but fpsetmask() can certainly cause it to). See also PR 56906. Bruce
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200401080930.i089UHZL024798>