Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 10 additions & 9 deletions libc/src/__support/math/exp.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,11 @@ static constexpr double LOG2_E = 0x1.71547652b82fep+0;

// Error bounds:
// Errors when using double precision.
static constexpr double ERR_D = 0x1.8p-63;
static constexpr double EXP_ERR_D = 0x1.8p-63;

#ifndef LIBC_MATH_HAS_SKIP_ACCURATE_PASS
// Errors when using double-double precision.
static constexpr double ERR_DD = 0x1.0p-99;
static constexpr double EXP_ERR_DD = 0x1.0p-99;
#endif // LIBC_MATH_HAS_SKIP_ACCURATE_PASS

// -2^-12 * log(2)
Expand Down Expand Up @@ -387,7 +387,8 @@ static double exp(double x) {

#ifdef LIBC_MATH_HAS_SKIP_ACCURATE_PASS
if (LIBC_UNLIKELY(denorm)) {
return ziv_test_denorm</*SKIP_ZIV_TEST=*/true>(hi, exp_mid.hi, lo, ERR_D)
return ziv_test_denorm</*SKIP_ZIV_TEST=*/true>(hi, exp_mid.hi, lo,
EXP_ERR_D)
.value();
} else {
// to multiply by 2^hi, a fast way is to simply add hi to the exponent
Expand All @@ -399,12 +400,12 @@ static double exp(double x) {
}
#else
if (LIBC_UNLIKELY(denorm)) {
if (auto r = ziv_test_denorm(hi, exp_mid.hi, lo, ERR_D);
if (auto r = ziv_test_denorm(hi, exp_mid.hi, lo, EXP_ERR_D);
LIBC_LIKELY(r.has_value()))
return r.value();
} else {
double upper = exp_mid.hi + (lo + ERR_D);
double lower = exp_mid.hi + (lo - ERR_D);
double upper = exp_mid.hi + (lo + EXP_ERR_D);
double lower = exp_mid.hi + (lo - EXP_ERR_D);

if (LIBC_LIKELY(upper == lower)) {
// to multiply by 2^hi, a fast way is to simply add hi to the exponent
Expand All @@ -419,12 +420,12 @@ static double exp(double x) {
DoubleDouble r_dd = exp_double_double(x, kd, exp_mid);

if (LIBC_UNLIKELY(denorm)) {
if (auto r = ziv_test_denorm(hi, r_dd.hi, r_dd.lo, ERR_DD);
if (auto r = ziv_test_denorm(hi, r_dd.hi, r_dd.lo, EXP_ERR_DD);
LIBC_LIKELY(r.has_value()))
return r.value();
} else {
double upper_dd = r_dd.hi + (r_dd.lo + ERR_DD);
double lower_dd = r_dd.hi + (r_dd.lo - ERR_DD);
double upper_dd = r_dd.hi + (r_dd.lo + EXP_ERR_DD);
double lower_dd = r_dd.hi + (r_dd.lo - EXP_ERR_DD);

if (LIBC_LIKELY(upper_dd == lower_dd)) {
int64_t exp_hi = static_cast<int64_t>(hi) << FPBits::FRACTION_LEN;
Expand Down
19 changes: 10 additions & 9 deletions libc/src/__support/math/exp10.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,11 @@ static constexpr double MLOG10_2_EXP2_M12_LO = 0x1.da994fd20dba2p-87;

// Error bounds:
// Errors when using double precision.
constexpr double ERR_D = 0x1.8p-63;
constexpr double EXP10_ERR_D = 0x1.8p-63;

#ifndef LIBC_MATH_HAS_SKIP_ACCURATE_PASS
// Errors when using double-double precision.
static constexpr double ERR_DD = 0x1.8p-99;
static constexpr double EXP10_ERR_DD = 0x1.8p-99;
#endif // LIBC_MATH_HAS_SKIP_ACCURATE_PASS

// Polynomial approximations with double precision. Generated by Sollya with:
Expand Down Expand Up @@ -207,17 +207,18 @@ static double exp10_denorm(double x) {
double lo = fputil::multiply_add(p, mid_lo, exp_mid.lo);

#ifdef LIBC_MATH_HAS_SKIP_ACCURATE_PASS
return ziv_test_denorm</*SKIP_ZIV_TEST=*/true>(hi, exp_mid.hi, lo, ERR_D)
return ziv_test_denorm</*SKIP_ZIV_TEST=*/true>(hi, exp_mid.hi, lo,
EXP10_ERR_D)
.value();
#else
if (auto r = ziv_test_denorm(hi, exp_mid.hi, lo, ERR_D);
if (auto r = ziv_test_denorm(hi, exp_mid.hi, lo, EXP10_ERR_D);
LIBC_LIKELY(r.has_value()))
return r.value();

// Use double-double
DoubleDouble r_dd = exp10_double_double(x, kd, exp_mid);

if (auto r = ziv_test_denorm(hi, r_dd.hi, r_dd.lo, ERR_DD);
if (auto r = ziv_test_denorm(hi, r_dd.hi, r_dd.lo, EXP10_ERR_DD);
LIBC_LIKELY(r.has_value()))
return r.value();

Expand Down Expand Up @@ -409,8 +410,8 @@ static constexpr double exp10(double x) {
cpp::bit_cast<double>(exp_hi + cpp::bit_cast<int64_t>(exp_mid.hi + lo));
return r;
#else
double upper = exp_mid.hi + (lo + ERR_D);
double lower = exp_mid.hi + (lo - ERR_D);
double upper = exp_mid.hi + (lo + EXP10_ERR_D);
double lower = exp_mid.hi + (lo - EXP10_ERR_D);

if (LIBC_LIKELY(upper == lower)) {
// To multiply by 2^hi, a fast way is to simply add hi to the exponent
Expand Down Expand Up @@ -476,8 +477,8 @@ static constexpr double exp10(double x) {
// Use double-double
DoubleDouble r_dd = exp10_double_double(x, kd, exp_mid);

double upper_dd = r_dd.hi + (r_dd.lo + ERR_DD);
double lower_dd = r_dd.hi + (r_dd.lo - ERR_DD);
double upper_dd = r_dd.hi + (r_dd.lo + EXP10_ERR_DD);
double lower_dd = r_dd.hi + (r_dd.lo - EXP10_ERR_DD);

if (LIBC_LIKELY(upper_dd == lower_dd)) {
// To multiply by 2^hi, a fast way is to simply add hi to the exponent
Expand Down
6 changes: 3 additions & 3 deletions libc/src/__support/math/exp10f_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIBC_SRC___SUPPORT_MATH_EXP_FLOAT_CONSTANTS_H
#define LLVM_LIBC_SRC___SUPPORT_MATH_EXP_FLOAT_CONSTANTS_H
#ifndef LLVM_LIBC_SRC___SUPPORT_MATH_EXP10F_UTILS_H
#define LLVM_LIBC_SRC___SUPPORT_MATH_EXP10F_UTILS_H

#include "src/__support/FPUtil/FPBits.h"
#include "src/__support/FPUtil/PolyEval.h"
Expand Down Expand Up @@ -154,4 +154,4 @@ LIBC_INLINE static constexpr exp_b_reduc_t exp_b_range_reduc(float x) {

} // namespace LIBC_NAMESPACE_DECL

#endif // LLVM_LIBC_SRC___SUPPORT_MATH_EXP_FLOAT_CONSTANTS_H
#endif // LLVM_LIBC_SRC___SUPPORT_MATH_EXP10F_UTILS_H
Loading