From fa752c698146ca3e9f7747d33059fbef9bb02b0e Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Sat, 26 Sep 2015 00:27:06 +0000 Subject: Fix powf inaccuracy (bug 18956). The flt-32 version of powf can be inaccurate because of bugs in the extra-precision calculation of (x-1)/(x+1) or (x-1.5)/(x+1.5) as part of calculating log(x) with extra precision: a constant used (as part of adding 1 or 1.5 through integer arithmetic) is incorrect, and then the code fails to mask a computed high part before using it in arithmetic that relies on s_h*t_h being exactly representable. This patch fixes these bugs. Tested for x86_64 and x86. x86_64 ulps for powf removed and regenerated to reflect reduced ulps from the increased accuracy for existing tests. [BZ #18956] * sysdeps/ieee754/flt-32/e_powf.c (__ieee754_powf): Add 0x00400000 not 0x0040000 for high bit of mantissa. Mask with 0xfffff000 when extracting high part. * math/auto-libm-test-in: Add another test of pow. * math/auto-libm-test-out: Regenerated. * sysdeps/x86_64/fpu/libm-test-ulps: Update. --- math/auto-libm-test-in | 1 + 1 file changed, 1 insertion(+) (limited to 'math/auto-libm-test-in') diff --git a/math/auto-libm-test-in b/math/auto-libm-test-in index 4b93857efb..e86be23fc8 100644 --- a/math/auto-libm-test-in +++ b/math/auto-libm-test-in @@ -3219,6 +3219,7 @@ pow 0x1.ce78f2p+0 -0x2.7f1f78p+4 pow 0xf.fffffp+124 -0x5.b5b648p+0 pow 0x1.430d4cp+0 0x5.0e462p+4 pow 0x9.8b82ap-4 -0x1.99907ap+12 +pow 0xd.73035p-4 -0x1.47bb8p+8 sin 0 sin -0 -- cgit v1.2.3