@@ -36,20 +36,20 @@ using Float128 = typename fputil::DyadicFloat<128>;
36
36
using LIBC_NAMESPACE::operator " " _u128;
37
37
38
38
// log2(10)
39
- constexpr double LOG2_10 = 0x1 .a934f0979a371p+1 ;
39
+ static constexpr double LOG2_10 = 0x1 .a934f0979a371p+1 ;
40
40
41
41
// -2^-12 * log10(2)
42
42
// > a = -2^-12 * log10(2);
43
43
// > b = round(a, 32, RN);
44
44
// > c = round(a - b, 32, RN);
45
45
// > d = round(a - b - c, D, RN);
46
46
// Errors < 1.5 * 2^-144
47
- constexpr double MLOG10_2_EXP2_M12_HI = -0x1 .3441350ap-14 ;
48
- constexpr double MLOG10_2_EXP2_M12_MID = 0x1 .0c0219dc1da99p-51 ;
47
+ static constexpr double MLOG10_2_EXP2_M12_HI = -0x1 .3441350ap-14 ;
48
+ static constexpr double MLOG10_2_EXP2_M12_MID = 0x1 .0c0219dc1da99p-51 ;
49
49
50
50
#ifndef LIBC_MATH_HAS_SKIP_ACCURATE_PASS
51
- constexpr double MLOG10_2_EXP2_M12_MID_32 = 0x1 .0c0219dcp-51 ;
52
- constexpr double MLOG10_2_EXP2_M12_LO = 0x1 .da994fd20dba2p-87 ;
51
+ static constexpr double MLOG10_2_EXP2_M12_MID_32 = 0x1 .0c0219dcp-51 ;
52
+ static constexpr double MLOG10_2_EXP2_M12_LO = 0x1 .da994fd20dba2p-87 ;
53
53
#endif // LIBC_MATH_HAS_SKIP_ACCURATE_PASS
54
54
55
55
// Error bounds:
@@ -58,17 +58,15 @@ constexpr double ERR_D = 0x1.8p-63;
58
58
59
59
#ifndef LIBC_MATH_HAS_SKIP_ACCURATE_PASS
60
60
// Errors when using double-double precision.
61
- constexpr double ERR_DD = 0x1 .8p-99 ;
61
+ static constexpr double ERR_DD = 0x1 .8p-99 ;
62
62
#endif // LIBC_MATH_HAS_SKIP_ACCURATE_PASS
63
63
64
- namespace {
65
-
66
64
// Polynomial approximations with double precision. Generated by Sollya with:
67
65
// > P = fpminimax((10^x - 1)/x, 3, [|D...|], [-2^-14, 2^-14]);
68
66
// > P;
69
67
// Error bounds:
70
68
// | output - (10^dx - 1) / dx | < 2^-52.
71
- LIBC_INLINE static double poly_approx_d (double dx) {
69
+ LIBC_INLINE static double exp10_poly_approx_d (double dx) {
72
70
// dx^2
73
71
double dx2 = dx * dx;
74
72
double c0 =
@@ -85,7 +83,7 @@ LIBC_INLINE static double poly_approx_d(double dx) {
85
83
// > P = fpminimax((10^x - 1)/x, 5, [|DD...|], [-2^-14, 2^-14]);
86
84
// Error bounds:
87
85
// | output - 10^(dx) | < 2^-101
88
- static constexpr DoubleDouble poly_approx_dd (const DoubleDouble &dx) {
86
+ static constexpr DoubleDouble exp10_poly_approx_dd (const DoubleDouble &dx) {
89
87
// Taylor polynomial.
90
88
constexpr DoubleDouble COEFFS[] = {
91
89
{0 , 0x1p0},
@@ -107,7 +105,7 @@ static constexpr DoubleDouble poly_approx_dd(const DoubleDouble &dx) {
107
105
// Return exp(dx) ~ 1 + a0 * dx + a1 * dx^2 + ... + a6 * dx^7
108
106
// For |dx| < 2^-14:
109
107
// | output - 10^dx | < 1.5 * 2^-124.
110
- static constexpr Float128 poly_approx_f128 (const Float128 &dx) {
108
+ static constexpr Float128 exp10_poly_approx_f128 (const Float128 &dx) {
111
109
constexpr Float128 COEFFS_128[]{
112
110
{Sign::POS, -127 , 0x80000000'00000000'00000000' 00000000_u128}, // 1.0
113
111
{Sign::POS, -126 , 0x935d8ddd'aaa8ac16'ea56d62b' 82d30a2d_u128},
@@ -149,7 +147,7 @@ static Float128 exp10_f128(double x, double kd, int idx1, int idx2) {
149
147
150
148
Float128 exp_mid = fputil::quick_mul (exp_mid1, exp_mid2);
151
149
152
- Float128 p = poly_approx_f128 (dx);
150
+ Float128 p = exp10_poly_approx_f128 (dx);
153
151
154
152
Float128 r = fputil::quick_mul (exp_mid, p);
155
153
@@ -172,7 +170,7 @@ static DoubleDouble exp10_double_double(double x, double kd,
172
170
173
171
// Degree-6 polynomial approximation in double-double precision.
174
172
// | p - 10^x | < 2^-103.
175
- DoubleDouble p = poly_approx_dd (dx);
173
+ DoubleDouble p = exp10_poly_approx_dd (dx);
176
174
177
175
// Error bounds: 2^-102.
178
176
DoubleDouble r = fputil::quick_mult (exp_mid, p);
@@ -204,7 +202,7 @@ static double exp10_denorm(double x) {
204
202
double mid_lo = dx * exp_mid.hi ;
205
203
206
204
// Approximate (10^dx - 1)/dx ~ 1 + a0*dx + a1*dx^2 + a2*dx^3 + a3*dx^4.
207
- double p = poly_approx_d (dx);
205
+ double p = exp10_poly_approx_d (dx);
208
206
209
207
double lo = fputil::multiply_add (p, mid_lo, exp_mid.lo );
210
208
@@ -235,7 +233,7 @@ static double exp10_denorm(double x) {
235
233
// * x >= log10(2^1024)
236
234
// * x <= log10(2^-1022)
237
235
// * x is inf or nan
238
- static constexpr double set_exceptional (double x) {
236
+ static constexpr double exp10_set_exceptional (double x) {
239
237
using FPBits = typename fputil::FPBits<double >;
240
238
FPBits xbits (x);
241
239
@@ -284,8 +282,6 @@ static constexpr double set_exceptional(double x) {
284
282
return x + FPBits::inf ().get_val ();
285
283
}
286
284
287
- } // namespace
288
-
289
285
namespace math {
290
286
291
287
static constexpr double exp10 (double x) {
@@ -299,7 +295,7 @@ static constexpr double exp10(double x) {
299
295
if (LIBC_UNLIKELY (x_u >= 0xc0733a7146f72a42 ||
300
296
(x_u <= 0xbc7bcb7b1526e50e && x_u >= 0x40734413509f79ff ) ||
301
297
x_u < 0x3c8bcb7b1526e50e )) {
302
- return set_exceptional (x);
298
+ return exp10_set_exceptional (x);
303
299
}
304
300
305
301
// Now log10(2^-1075) < x <= log10(1 - 2^-54) or
@@ -403,7 +399,7 @@ static constexpr double exp10(double x) {
403
399
double mid_lo = dx * exp_mid.hi ;
404
400
405
401
// Approximate (10^dx - 1)/dx ~ 1 + a0*dx + a1*dx^2 + a2*dx^3 + a3*dx^4.
406
- double p = poly_approx_d (dx);
402
+ double p = exp10_poly_approx_d (dx);
407
403
408
404
double lo = fputil::multiply_add (p, mid_lo, exp_mid.lo );
409
405
0 commit comments