diff options
Diffstat (limited to 'pl/math/v_atanh_3u5.c')
-rw-r--r-- | pl/math/v_atanh_3u5.c | 47 |
1 files changed, 2 insertions, 45 deletions
diff --git a/pl/math/v_atanh_3u5.c b/pl/math/v_atanh_3u5.c index ca68020..ffd6f59 100644 --- a/pl/math/v_atanh_3u5.c +++ b/pl/math/v_atanh_3u5.c @@ -12,56 +12,13 @@ #if V_SUPPORTED -#define Ln2Hi v_f64 (0x1.62e42fefa3800p-1) -#define Ln2Lo v_f64 (0x1.ef35793c76730p-45) -#define HfRt2Top 0x3fe6a09e00000000 /* top32(asuint64(sqrt(2)/2)) << 32. */ -#define OneMHfRt2Top \ - 0x00095f6200000000 /* (top32(asuint64(1)) - top32(asuint64(sqrt(2)/2))) \ - << 32. */ -#define OneTop12 0x3ff -#define BottomMask 0xffffffff +#define WANT_V_LOG1P_K0_SHORTCUT 0 +#include "v_log1p_inline.h" #define AbsMask 0x7fffffffffffffff #define Half 0x3fe0000000000000 #define One 0x3ff0000000000000 -#define C(i) v_f64 (__log1p_data.coeffs[i]) - -static inline v_f64_t -log1p_inline (v_f64_t x) -{ - /* Helper for calculating log(1 + x) using order-18 polynomial on a reduced - interval. Copied from v_log1p_2u5.c, with the following modifications: - - No special-case handling. - - Pairwise Horner instead of Estrin for improved accuracy. - - Slightly different recombination to reuse f2. - See original source for details of the algorithm. */ - v_f64_t m = x + 1; - v_u64_t mi = v_as_u64_f64 (m); - - /* Decompose x + 1 into (f + 1) * 2^k, with k chosen such that f is in - [sqrt(2)/2, sqrt(2)]. */ - v_u64_t u = mi + OneMHfRt2Top; - v_s64_t ki = v_as_s64_u64 (u >> 52) - OneTop12; - v_f64_t k = v_to_f64_s64 (ki); - v_u64_t utop = (u & 0x000fffff00000000) + HfRt2Top; - v_u64_t u_red = utop | (mi & BottomMask); - v_f64_t f = v_as_f64_u64 (u_red) - 1; - - /* Correction term for round-off in f. */ - v_f64_t cm = (x - (m - 1)) / m; - - /* Approximate log1p(f) with polynomial. */ - v_f64_t f2 = f * f; - v_f64_t p = PAIRWISE_HORNER_18 (f, f2, C); - - /* Recombine log1p(x) = k*log2 + log1p(f) + c/m. */ - v_f64_t ylo = v_fma_f64 (k, Ln2Lo, cm); - v_f64_t yhi = v_fma_f64 (k, Ln2Hi, f); - v_f64_t y = v_fma_f64 (f2, p, ylo + yhi); - return y; -} - VPCS_ATTR NOINLINE static v_f64_t specialcase (v_f64_t x, v_f64_t y, v_u64_t special) |