\log \left(x + \sqrt{x \cdot x + 1}\right)\begin{array}{l}
\mathbf{if}\;x \le -1.002814715336328044159586170280817896128:\\
\;\;\;\;\log \left(\frac{0.125}{{x}^{3}} - \left(\frac{0.0625}{{x}^{5}} + \frac{0.5}{x}\right)\right)\\
\mathbf{elif}\;x \le 0.9017023301953626113203199565759859979153:\\
\;\;\;\;\left(\log \left(\sqrt{1}\right) + \frac{x}{\sqrt{1}}\right) - \frac{1}{6} \cdot \frac{{x}^{3}}{{\left(\sqrt{1}\right)}^{3}}\\
\mathbf{else}:\\
\;\;\;\;\log \left(\mathsf{fma}\left(x, 2, \frac{0.5}{x} - \frac{0.125}{{x}^{3}}\right)\right)\\
\end{array}double f(double x) {
double r132660 = x;
double r132661 = r132660 * r132660;
double r132662 = 1.0;
double r132663 = r132661 + r132662;
double r132664 = sqrt(r132663);
double r132665 = r132660 + r132664;
double r132666 = log(r132665);
return r132666;
}
double f(double x) {
double r132667 = x;
double r132668 = -1.002814715336328;
bool r132669 = r132667 <= r132668;
double r132670 = 0.125;
double r132671 = 3.0;
double r132672 = pow(r132667, r132671);
double r132673 = r132670 / r132672;
double r132674 = 0.0625;
double r132675 = 5.0;
double r132676 = pow(r132667, r132675);
double r132677 = r132674 / r132676;
double r132678 = 0.5;
double r132679 = r132678 / r132667;
double r132680 = r132677 + r132679;
double r132681 = r132673 - r132680;
double r132682 = log(r132681);
double r132683 = 0.9017023301953626;
bool r132684 = r132667 <= r132683;
double r132685 = 1.0;
double r132686 = sqrt(r132685);
double r132687 = log(r132686);
double r132688 = r132667 / r132686;
double r132689 = r132687 + r132688;
double r132690 = 0.16666666666666666;
double r132691 = pow(r132686, r132671);
double r132692 = r132672 / r132691;
double r132693 = r132690 * r132692;
double r132694 = r132689 - r132693;
double r132695 = 2.0;
double r132696 = r132679 - r132673;
double r132697 = fma(r132667, r132695, r132696);
double r132698 = log(r132697);
double r132699 = r132684 ? r132694 : r132698;
double r132700 = r132669 ? r132682 : r132699;
return r132700;
}




Bits error versus x
| Original | 53.1 |
|---|---|
| Target | 45.2 |
| Herbie | 0.2 |
if x < -1.002814715336328Initial program 63.1
Simplified63.1
Taylor expanded around -inf 0.2
Simplified0.2
if -1.002814715336328 < x < 0.9017023301953626Initial program 58.7
Simplified58.7
Taylor expanded around 0 0.2
if 0.9017023301953626 < x Initial program 32.2
Simplified32.2
Taylor expanded around inf 0.1
Simplified0.1
Final simplification0.2
herbie shell --seed 2019323 +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)))))