\log \left(1 + x\right)
\begin{array}{l}
\mathbf{if}\;1 + x \le 1.0000000084552092:\\
\;\;\;\;\left(1 \cdot x + \log 1\right) - \frac{1}{2} \cdot \frac{{x}^{2}}{{1}^{2}}\\
\mathbf{else}:\\
\;\;\;\;\sqrt{\left(2 \cdot \log \left(\sqrt{1 + x}\right)\right) \cdot \log \left(1 + x\right)}\\
\end{array}double f(double x) {
double r75193 = 1.0;
double r75194 = x;
double r75195 = r75193 + r75194;
double r75196 = log(r75195);
return r75196;
}
double f(double x) {
double r75197 = 1.0;
double r75198 = x;
double r75199 = r75197 + r75198;
double r75200 = 1.0000000084552092;
bool r75201 = r75199 <= r75200;
double r75202 = r75197 * r75198;
double r75203 = log(r75197);
double r75204 = r75202 + r75203;
double r75205 = 0.5;
double r75206 = 2.0;
double r75207 = pow(r75198, r75206);
double r75208 = pow(r75197, r75206);
double r75209 = r75207 / r75208;
double r75210 = r75205 * r75209;
double r75211 = r75204 - r75210;
double r75212 = sqrt(r75199);
double r75213 = log(r75212);
double r75214 = r75206 * r75213;
double r75215 = log(r75199);
double r75216 = r75214 * r75215;
double r75217 = sqrt(r75216);
double r75218 = r75201 ? r75211 : r75217;
return r75218;
}




Bits error versus x
Results
| Original | 39.3 |
|---|---|
| Target | 0.2 |
| Herbie | 0.3 |
if (+ 1.0 x) < 1.0000000084552092Initial program 59.4
Taylor expanded around 0 0.3
if 1.0000000084552092 < (+ 1.0 x) Initial program 0.3
rmApplied add-sqr-sqrt0.8
rmApplied add-sqr-sqrt0.8
Applied log-prod0.8
rmApplied sqrt-unprod0.3
Simplified0.3
Final simplification0.3
herbie shell --seed 2020039
(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)))