Date: Mon, 4 Sep 2000 23:50:03 -0700 (PDT) From: Bruce Evans <bde@zeta.org.au> To: freebsd-bugs@FreeBSD.org Subject: Re: bin/21024: pow() ERANGE bug Message-ID: <200009050650.XAA50123@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/21024; it has been noted by GNATS.
From: Bruce Evans <bde@zeta.org.au>
To: aa8vb@nc.rr.com
Cc: FreeBSD-gnats-submit@FreeBSD.ORG
Subject: Re: bin/21024: pow() ERANGE bug
Date: Tue, 5 Sep 2000 17:40:55 +1100 (EST)
On Mon, 4 Sep 2000 aa8vb@nc.rr.com wrote:
> >Description:
>
> According to the man page:
>
> The functions exp(), expm1(), pow() detect if the computed value will
> overflow, set the global variable errno to ERANGE, and ...
This is mainly a bug in the man page. This part of it describes the
behaviour of pow() in the old BSD libm, but we use Sun's fdlibm. The
man page had already rotted for exp() and expm1() in the old libm --
errno was set for pow() on Vaxes and Tahoes, but was not set for exp()
or expm1() on any machine.
The man page actually says:
... set the global variable errno to ERANGE [no comma here] and cause
a reserved operand fault on a Vax or Tahoe.
so it is not clear that ERANGE is set except on Vaxes and Tahoes. In fact,
according to the sources it _is_ only set on Vaxes and Tahoes (all settings
of errno in the old libm are done by infnan.s which only exists for Vaxes
and Tahoes).
> However, pow() does not set errno to ERANGE on overflow.
The actual behaviour on overflow is:
(1) Attempt to set the IEEE exception flags (if any) in an IEEE'ish
way by evaluating the overflowing expression `huge*huge' where
`huge' is `static const double huge = 1.0e300'. This normally
fails due to dubious compiler optimizations (gcc evaluates the
expression at compile time and doesn't generate code to set the
flags at runtime).
(2) If libm is compiled with -D_POSIX_MODE and the library mode is not
changed from the resulting default, then set errno to ERANGE.
-D_POSIX_MODE is not the default and not recommended, although it
is required for "POSIX" (actually old Standard C) conformance --
see src/lib/msun/Makefile. It mainly slows things down and messes
up the return value for domain errors. There are other configuration
flags/library modes which mess up the return value even for range
errors.
This non-conformance with old Standard C is unlikely to be changed, since
setting errno for math functions is considered harmful and is not required
in the current C standard.
This PR should be turned into one about the libm man pages. The descriptions
of error handling are anachronistic and/or incomplete. As an example of
incompleteness, there are 19 special cases for pow() (see the sources) and
only a couple of these are described in the man page.
Bruce
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200009050650.XAA50123>
