aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/powerpc
diff options
context:
space:
mode:
authorPaul Zimmermann <Paul.Zimmermann@inria.fr>2021-04-01 08:14:10 +0200
committerPaul Zimmermann <Paul.Zimmermann@inria.fr>2021-04-02 06:15:48 +0200
commit9acda61d94acc5348c2330f2519a14d1a4a37e73 (patch)
treedcad90e95870279c37b5be7c646b3a3f6edc15cb /sysdeps/powerpc
parent595c22ecd8e87a27fd19270ed30fdbae9ad25426 (diff)
downloadglibc-9acda61d94acc5348c2330f2519a14d1a4a37e73.zip
glibc-9acda61d94acc5348c2330f2519a14d1a4a37e73.tar.gz
glibc-9acda61d94acc5348c2330f2519a14d1a4a37e73.tar.bz2
Fix the inaccuracy of j0f/j1f/y0f/y1f [BZ #14469, #14470, #14471, #14472]
For j0f/j1f/y0f/y1f, the largest error for all binary32 inputs is reduced to at most 9 ulps for all rounding modes. The new code is enabled only when there is a cancellation at the very end of the j0f/j1f/y0f/y1f computation, or for very large inputs, thus should not give any visible slowdown on average. Two different algorithms are used: * around the first 64 zeros of j0/j1/y0/y1, approximation polynomials of degree 3 are used, computed using the Sollya tool (https://www.sollya.org/) * for large inputs, an asymptotic formula from [1] is used [1] Fast and Accurate Bessel Function Computation, John Harrison, Proceedings of Arith 19, 2009. Inputs yielding the new largest errors are added to auto-libm-test-in, and ulps are regenerated for various targets (thanks Adhemerval Zanella). Tested on x86_64 with --disable-multi-arch and on powerpc64le-linux-gnu. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Diffstat (limited to 'sysdeps/powerpc')
-rw-r--r--sysdeps/powerpc/fpu/libm-test-ulps62
1 files changed, 31 insertions, 31 deletions
diff --git a/sysdeps/powerpc/fpu/libm-test-ulps b/sysdeps/powerpc/fpu/libm-test-ulps
index 173388b..3010e10 100644
--- a/sysdeps/powerpc/fpu/libm-test-ulps
+++ b/sysdeps/powerpc/fpu/libm-test-ulps
@@ -1310,50 +1310,50 @@ float128: 1
ldouble: 3
Function: "j0":
-double: 2
-float: 8
+double: 3
+float: 9
float128: 2
-ldouble: 2
+ldouble: 5
Function: "j0_downward":
-double: 2
-float: 4
+double: 6
+float: 9
float128: 4
ldouble: 12
Function: "j0_towardzero":
-double: 5
-float: 6
+double: 7
+float: 9
float128: 4
ldouble: 16
Function: "j0_upward":
-double: 4
-float: 5
+double: 9
+float: 8
float128: 5
-ldouble: 6
+ldouble: 14
Function: "j1":
-double: 2
-float: 8
+double: 4
+float: 9
float128: 4
-ldouble: 3
+ldouble: 6
Function: "j1_downward":
double: 3
-float: 5
+float: 8
float128: 4
ldouble: 7
Function: "j1_towardzero":
-double: 3
-float: 2
+double: 4
+float: 8
float128: 4
ldouble: 7
Function: "j1_upward":
-double: 3
-float: 4
+double: 9
+float: 9
float128: 3
ldouble: 6
@@ -1706,49 +1706,49 @@ ldouble: 5
Function: "y0":
double: 2
-float: 6
+float: 8
float128: 3
-ldouble: 1
+ldouble: 10
Function: "y0_downward":
double: 3
-float: 4
+float: 8
float128: 4
ldouble: 10
Function: "y0_towardzero":
double: 3
-float: 3
+float: 8
float128: 3
-ldouble: 8
+ldouble: 9
Function: "y0_upward":
double: 2
-float: 5
+float: 8
float128: 3
ldouble: 9
Function: "y1":
double: 3
-float: 2
+float: 9
float128: 2
ldouble: 2
Function: "y1_downward":
-double: 3
-float: 2
+double: 6
+float: 8
float128: 4
-ldouble: 7
+ldouble: 11
Function: "y1_towardzero":
double: 3
-float: 2
+float: 9
float128: 2
ldouble: 9
Function: "y1_upward":
-double: 5
-float: 2
+double: 6
+float: 9
float128: 5
ldouble: 9