Skip to content

Commit ba1c1d1

Browse files
committed
prefix utilities with exp10
1 parent bcf433b commit ba1c1d1

File tree

1 file changed

+15
-19
lines changed

1 file changed

+15
-19
lines changed

libc/src/__support/math/exp10.h

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -36,20 +36,20 @@ using Float128 = typename fputil::DyadicFloat<128>;
3636
using LIBC_NAMESPACE::operator""_u128;
3737

3838
// log2(10)
39-
constexpr double LOG2_10 = 0x1.a934f0979a371p+1;
39+
static constexpr double LOG2_10 = 0x1.a934f0979a371p+1;
4040

4141
// -2^-12 * log10(2)
4242
// > a = -2^-12 * log10(2);
4343
// > b = round(a, 32, RN);
4444
// > c = round(a - b, 32, RN);
4545
// > d = round(a - b - c, D, RN);
4646
// 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;
4949

5050
#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;
5353
#endif // LIBC_MATH_HAS_SKIP_ACCURATE_PASS
5454

5555
// Error bounds:
@@ -58,17 +58,15 @@ constexpr double ERR_D = 0x1.8p-63;
5858

5959
#ifndef LIBC_MATH_HAS_SKIP_ACCURATE_PASS
6060
// Errors when using double-double precision.
61-
constexpr double ERR_DD = 0x1.8p-99;
61+
static constexpr double ERR_DD = 0x1.8p-99;
6262
#endif // LIBC_MATH_HAS_SKIP_ACCURATE_PASS
6363

64-
namespace {
65-
6664
// Polynomial approximations with double precision. Generated by Sollya with:
6765
// > P = fpminimax((10^x - 1)/x, 3, [|D...|], [-2^-14, 2^-14]);
6866
// > P;
6967
// Error bounds:
7068
// | 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) {
7270
// dx^2
7371
double dx2 = dx * dx;
7472
double c0 =
@@ -85,7 +83,7 @@ LIBC_INLINE static double poly_approx_d(double dx) {
8583
// > P = fpminimax((10^x - 1)/x, 5, [|DD...|], [-2^-14, 2^-14]);
8684
// Error bounds:
8785
// | 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) {
8987
// Taylor polynomial.
9088
constexpr DoubleDouble COEFFS[] = {
9189
{0, 0x1p0},
@@ -107,7 +105,7 @@ static constexpr DoubleDouble poly_approx_dd(const DoubleDouble &dx) {
107105
// Return exp(dx) ~ 1 + a0 * dx + a1 * dx^2 + ... + a6 * dx^7
108106
// For |dx| < 2^-14:
109107
// | 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) {
111109
constexpr Float128 COEFFS_128[]{
112110
{Sign::POS, -127, 0x80000000'00000000'00000000'00000000_u128}, // 1.0
113111
{Sign::POS, -126, 0x935d8ddd'aaa8ac16'ea56d62b'82d30a2d_u128},
@@ -149,7 +147,7 @@ static Float128 exp10_f128(double x, double kd, int idx1, int idx2) {
149147

150148
Float128 exp_mid = fputil::quick_mul(exp_mid1, exp_mid2);
151149

152-
Float128 p = poly_approx_f128(dx);
150+
Float128 p = exp10_poly_approx_f128(dx);
153151

154152
Float128 r = fputil::quick_mul(exp_mid, p);
155153

@@ -172,7 +170,7 @@ static DoubleDouble exp10_double_double(double x, double kd,
172170

173171
// Degree-6 polynomial approximation in double-double precision.
174172
// | p - 10^x | < 2^-103.
175-
DoubleDouble p = poly_approx_dd(dx);
173+
DoubleDouble p = exp10_poly_approx_dd(dx);
176174

177175
// Error bounds: 2^-102.
178176
DoubleDouble r = fputil::quick_mult(exp_mid, p);
@@ -204,7 +202,7 @@ static double exp10_denorm(double x) {
204202
double mid_lo = dx * exp_mid.hi;
205203

206204
// 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);
208206

209207
double lo = fputil::multiply_add(p, mid_lo, exp_mid.lo);
210208

@@ -235,7 +233,7 @@ static double exp10_denorm(double x) {
235233
// * x >= log10(2^1024)
236234
// * x <= log10(2^-1022)
237235
// * x is inf or nan
238-
static constexpr double set_exceptional(double x) {
236+
static constexpr double exp10_set_exceptional(double x) {
239237
using FPBits = typename fputil::FPBits<double>;
240238
FPBits xbits(x);
241239

@@ -284,8 +282,6 @@ static constexpr double set_exceptional(double x) {
284282
return x + FPBits::inf().get_val();
285283
}
286284

287-
} // namespace
288-
289285
namespace math {
290286

291287
static constexpr double exp10(double x) {
@@ -299,7 +295,7 @@ static constexpr double exp10(double x) {
299295
if (LIBC_UNLIKELY(x_u >= 0xc0733a7146f72a42 ||
300296
(x_u <= 0xbc7bcb7b1526e50e && x_u >= 0x40734413509f79ff) ||
301297
x_u < 0x3c8bcb7b1526e50e)) {
302-
return set_exceptional(x);
298+
return exp10_set_exceptional(x);
303299
}
304300

305301
// Now log10(2^-1075) < x <= log10(1 - 2^-54) or
@@ -403,7 +399,7 @@ static constexpr double exp10(double x) {
403399
double mid_lo = dx * exp_mid.hi;
404400

405401
// 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);
407403

408404
double lo = fputil::multiply_add(p, mid_lo, exp_mid.lo);
409405

0 commit comments

Comments
 (0)