\log \left(x + \sqrt{x \cdot x + 1}\right)\begin{array}{l}
\mathbf{if}\;x \le -1.004281043358186797931352884916123002768:\\
\;\;\;\;\log \left(\frac{0.125}{{x}^{3}} - \left(\frac{0.0625}{{x}^{5}} + \frac{0.5}{x}\right)\right)\\
\mathbf{elif}\;x \le 0.8904752561288424850260980747407302260399:\\
\;\;\;\;\mathsf{fma}\left(\frac{{x}^{3}}{{\left(\sqrt{1}\right)}^{3}}, \frac{-1}{6}, \log \left(\sqrt{1}\right) + \frac{x}{\sqrt{1}}\right)\\
\mathbf{else}:\\
\;\;\;\;\log \left(\left(\left(\frac{0.5}{x} - \frac{0.125}{{x}^{3}}\right) + x\right) + x\right)\\
\end{array}double f(double x) {
double r166410 = x;
double r166411 = r166410 * r166410;
double r166412 = 1.0;
double r166413 = r166411 + r166412;
double r166414 = sqrt(r166413);
double r166415 = r166410 + r166414;
double r166416 = log(r166415);
return r166416;
}
double f(double x) {
double r166417 = x;
double r166418 = -1.0042810433581868;
bool r166419 = r166417 <= r166418;
double r166420 = 0.125;
double r166421 = 3.0;
double r166422 = pow(r166417, r166421);
double r166423 = r166420 / r166422;
double r166424 = 0.0625;
double r166425 = 5.0;
double r166426 = pow(r166417, r166425);
double r166427 = r166424 / r166426;
double r166428 = 0.5;
double r166429 = r166428 / r166417;
double r166430 = r166427 + r166429;
double r166431 = r166423 - r166430;
double r166432 = log(r166431);
double r166433 = 0.8904752561288425;
bool r166434 = r166417 <= r166433;
double r166435 = 1.0;
double r166436 = sqrt(r166435);
double r166437 = pow(r166436, r166421);
double r166438 = r166422 / r166437;
double r166439 = -0.16666666666666666;
double r166440 = log(r166436);
double r166441 = r166417 / r166436;
double r166442 = r166440 + r166441;
double r166443 = fma(r166438, r166439, r166442);
double r166444 = r166429 - r166423;
double r166445 = r166444 + r166417;
double r166446 = r166445 + r166417;
double r166447 = log(r166446);
double r166448 = r166434 ? r166443 : r166447;
double r166449 = r166419 ? r166432 : r166448;
return r166449;
}




Bits error versus x
| Original | 53.1 |
|---|---|
| Target | 45.4 |
| Herbie | 0.3 |
if x < -1.0042810433581868Initial program 62.8
Simplified62.8
Taylor expanded around -inf 0.2
Simplified0.2
if -1.0042810433581868 < x < 0.8904752561288425Initial program 58.6
Simplified58.6
Taylor expanded around 0 0.3
Simplified0.3
if 0.8904752561288425 < x Initial program 32.2
Simplified32.2
Taylor expanded around inf 0.2
Simplified0.2
Final simplification0.3
herbie shell --seed 2019326 +o rules:numerics
(FPCore (x)
:name "Hyperbolic arcsine"
:precision binary64
:herbie-target
(if (< x 0.0) (log (/ -1 (- x (sqrt (+ (* x x) 1))))) (log (+ x (sqrt (+ (* x x) 1)))))
(log (+ x (sqrt (+ (* x x) 1)))))