diff options
author | Joe Ramsay <Joe.Ramsay@arm.com> | 2023-12-01 09:49:45 +0000 |
---|---|---|
committer | Szabolcs Nagy <szabolcs.nagy@arm.com> | 2023-12-04 15:52:11 +0000 |
commit | 63d0a35d5f223a3f4b68190567b7d4d44545bce5 (patch) | |
tree | 69b006288d047188fcd0b81906647f9168a9eb65 /sysdeps/ieee754/dbl-64/e_exp_data.c | |
parent | 8e755f5bc8f57d0034c12f34c11ce8a83103dc65 (diff) | |
download | glibc-63d0a35d5f223a3f4b68190567b7d4d44545bce5.tar.gz glibc-63d0a35d5f223a3f4b68190567b7d4d44545bce5.tar.xz glibc-63d0a35d5f223a3f4b68190567b7d4d44545bce5.zip |
math: Add new exp10 implementation
New implementation is based on the existing exp/exp2, with different reduction constants and polynomial. Worst-case error in round-to- nearest is 0.513 ULP. The exp/exp2 shared table is reused for exp10 - .rodata size of e_exp_data increases by 64 bytes. As for exp/exp2, targets with single-instruction rounding/conversion intrinsics can use them by toggling TOINT_INTRINSICS=1 and adding the necessary code to their math_private.h. Improvements on Neoverse V1 compared to current GLIBC master: exp10 thruput: 3.3x in [-0x1.439b746e36b52p+8 0x1.34413509f79ffp+8] exp10 latency: 1.8x in [-0x1.439b746e36b52p+8 0x1.34413509f79ffp+8] Tested on: aarch64-linux-gnu (TOINT_INTRINSICS, fma contraction) and x86_64-linux-gnu (!TOINT_INTRINSICS, no fma contraction) Reviewed-by: Szabolcs Nagy <szabolcs.nagy@arm.com>
Diffstat (limited to 'sysdeps/ieee754/dbl-64/e_exp_data.c')
-rw-r--r-- | sysdeps/ieee754/dbl-64/e_exp_data.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/sysdeps/ieee754/dbl-64/e_exp_data.c b/sysdeps/ieee754/dbl-64/e_exp_data.c index d498b8bc3b..5c774afbcb 100644 --- a/sysdeps/ieee754/dbl-64/e_exp_data.c +++ b/sysdeps/ieee754/dbl-64/e_exp_data.c @@ -58,6 +58,17 @@ const struct exp_data __exp_data = { 0x1.5d7e09b4e3a84p-10, #endif }, +.invlog10_2N = 0x1.a934f0979a371p1 * N, +.neglog10_2hiN = -0x1.3441350ap-2 / N, +.neglog10_2loN = 0x1.0c0219dc1da99p-39 / N, +.exp10_poly = { +/* Coeffs generated using Remez in [-log10(2)/256, log10(2)/256 ]. */ +0x1.26bb1bbb55516p1, +0x1.53524c73ce9fep1, +0x1.0470591ce4b26p1, +0x1.2bd76577fe684p0, +0x1.1446eeccd0efbp-1 +}, // 2^(k/N) ~= H[k]*(1 + T[k]) for int k in [0,N) // tab[2*k] = asuint64(T[k]) // tab[2*k+1] = asuint64(H[k]) - (k << 52)/N |