\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(1, x, \log 1\right) - \frac{1}{2} \cdot \frac{{x}^{2}}{{1}^{2}}}\right)\right)double f(double x) {
double r109961 = 1.0;
double r109962 = x;
double r109963 = r109961 - r109962;
double r109964 = log(r109963);
double r109965 = r109961 + r109962;
double r109966 = log(r109965);
double r109967 = r109964 / r109966;
return r109967;
}
double f(double x) {
double r109968 = 1.0;
double r109969 = log(r109968);
double r109970 = x;
double r109971 = 0.5;
double r109972 = 2.0;
double r109973 = pow(r109970, r109972);
double r109974 = pow(r109968, r109972);
double r109975 = r109973 / r109974;
double r109976 = r109971 * r109975;
double r109977 = fma(r109968, r109970, r109976);
double r109978 = r109969 - r109977;
double r109979 = fma(r109968, r109970, r109969);
double r109980 = r109979 - r109976;
double r109981 = r109978 / r109980;
double r109982 = expm1(r109981);
double r109983 = log1p(r109982);
return r109983;
}




Bits error versus x
| Original | 61.3 |
|---|---|
| Target | 0.3 |
| Herbie | 0.5 |
Initial program 61.3
Taylor expanded around 0 60.5
Simplified60.5
Taylor expanded around 0 0.5
Simplified0.5
rmApplied log1p-expm1-u0.5
Final simplification0.5
herbie shell --seed 2020045 +o rules:numerics
(FPCore (x)
:name "qlog (example 3.10)"
:precision binary64
:pre (and (< -1 x) (< x 1))
:herbie-target
(- (+ (+ (+ 1 x) (/ (* x x) 2)) (* 0.4166666666666667 (pow x 3))))
(/ (log (- 1 x)) (log (+ 1 x))))