\log \left(1 + x\right)
\begin{array}{l}
\mathbf{if}\;1 + x \le 1.000000005236653777274113963358104228973:\\
\;\;\;\;\mathsf{fma}\left(x, 1 - x \cdot 0.5, \log 1\right)\\
\mathbf{else}:\\
\;\;\;\;\log \left(1 + x\right)\\
\end{array}double f(double x) {
double r45162 = 1.0;
double r45163 = x;
double r45164 = r45162 + r45163;
double r45165 = log(r45164);
return r45165;
}
double f(double x) {
double r45166 = 1.0;
double r45167 = x;
double r45168 = r45166 + r45167;
double r45169 = 1.0000000052366538;
bool r45170 = r45168 <= r45169;
double r45171 = 0.5;
double r45172 = r45167 * r45171;
double r45173 = r45166 - r45172;
double r45174 = log(r45166);
double r45175 = fma(r45167, r45173, r45174);
double r45176 = log(r45168);
double r45177 = r45170 ? r45175 : r45176;
return r45177;
}




Bits error versus x
| Original | 39.2 |
|---|---|
| Target | 0.3 |
| Herbie | 0.3 |
if (+ 1.0 x) < 1.0000000052366538Initial program 59.2
Taylor expanded around 0 0.4
Simplified0.4
Taylor expanded around 0 0.4
Simplified0.4
if 1.0000000052366538 < (+ 1.0 x) Initial program 0.3
Final simplification0.3
herbie shell --seed 2019235 +o rules:numerics
(FPCore (x)
:name "ln(1 + x)"
:precision binary64
:herbie-target
(if (== (+ 1 x) 1) x (/ (* x (log (+ 1 x))) (- (+ 1 x) 1)))
(log (+ 1 x)))