Fix acosf underflow (bug 14153)
Andreas Jaeger
aj@suse.com
Fri May 25 11:04:00 GMT 2012
On 05/24/2012 11:52 PM, Joseph S. Myers wrote:
> Bug 14153 is a spurious underflow exception from acosf (2e-17); the
> cause is the acosf implementation calculating a value on the order of
> the cube of its argument, which underflows. There is a test for very
> small arguments, maybe to avoid underflow, and if such an argument is
> encountered it returns pi/2 (computed by adding high and low parts, I
> suppose to get correct results for the current rounding mode and to
> raise the inexact exception). However, this tests for values no more
> than 2**-57, as if the test was unchanged from a "double" version of
> the function; it suffices to test for values no more than 2**-26,
> which avoids the problem with internal underflows. (For small x, the
> correct value is essentially pi/2 - x. Compute pi/2 rounded to 25
> bits - one more bit than float - which is the nearest value that is
> representable as float or half way between two representable values.
> Compute the difference of pi/2 and that rounded values; if |x| is
> smaller than that difference then the result of rounding pi/2 - x will
> be the same in any rounding mode as the result of rounding pi/2. Now
> that difference is more than 2**-26.)
>
> I propose this patch fixing the bug that way. Tested x86_64 and x86.
thanks, this is fine,
Andreas
--
Andreas Jaeger aj@{suse.com,opensuse.org} Twitter/Identica: jaegerandi
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn,Jennifer Guild,Felix Imendörffer,HRB16746 (AG Nürnberg)
GPG fingerprint = 93A3 365E CE47 B889 DF7F FED1 389A 563C C272 A126
More information about the Libc-alpha
mailing list