\frac{\log \left(1 - x\right)}{\log \left(1 + x\right)}\mathsf{log1p}\left(\mathsf{expm1}\left(\frac{\log 1 - \mathsf{fma}\left(1, x, \frac{1}{2} \cdot \frac{{x}^{2}}{{1}^{2}}\right)}{\mathsf{fma}\left(\frac{-1}{2}, \frac{{x}^{2}}{{1}^{2}}, \mathsf{fma}\left(1, x, \log 1\right)\right)}\right)\right)double f(double x) {
double r63450 = 1.0;
double r63451 = x;
double r63452 = r63450 - r63451;
double r63453 = log(r63452);
double r63454 = r63450 + r63451;
double r63455 = log(r63454);
double r63456 = r63453 / r63455;
return r63456;
}
double f(double x) {
double r63457 = 1.0;
double r63458 = log(r63457);
double r63459 = x;
double r63460 = 0.5;
double r63461 = 2.0;
double r63462 = pow(r63459, r63461);
double r63463 = pow(r63457, r63461);
double r63464 = r63462 / r63463;
double r63465 = r63460 * r63464;
double r63466 = fma(r63457, r63459, r63465);
double r63467 = r63458 - r63466;
double r63468 = -0.5;
double r63469 = fma(r63457, r63459, r63458);
double r63470 = fma(r63468, r63464, r63469);
double r63471 = r63467 / r63470;
double r63472 = expm1(r63471);
double r63473 = log1p(r63472);
return r63473;
}




Bits error versus x
| Original | 61.4 |
|---|---|
| Target | 0.3 |
| Herbie | 0.4 |
Initial program 61.4
Taylor expanded around 0 60.5
Simplified60.5
Taylor expanded around 0 0.4
Simplified0.4
rmApplied log1p-expm1-u0.4
Final simplification0.4
herbie shell --seed 2019199 +o rules:numerics
(FPCore (x)
:name "qlog (example 3.10)"
:pre (and (< -1.0 x) (< x 1.0))
:herbie-target
(- (+ (+ (+ 1.0 x) (/ (* x x) 2.0)) (* 0.4166666666666667 (pow x 3.0))))
(/ (log (- 1.0 x)) (log (+ 1.0 x))))