\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:\\
\;\;\;\;\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(\mathsf{fma}\left(2, x, \frac{0.5}{x} - \frac{0.125}{{x}^{3}}\right)\right)\\
\end{array}double f(double x) {
double r160690 = x;
double r160691 = r160690 * r160690;
double r160692 = 1.0;
double r160693 = r160691 + r160692;
double r160694 = sqrt(r160693);
double r160695 = r160690 + r160694;
double r160696 = log(r160695);
return r160696;
}
double f(double x) {
double r160697 = x;
double r160698 = -1.002814715336328;
bool r160699 = r160697 <= r160698;
double r160700 = 0.125;
double r160701 = 3.0;
double r160702 = pow(r160697, r160701);
double r160703 = r160700 / r160702;
double r160704 = 0.0625;
double r160705 = 5.0;
double r160706 = pow(r160697, r160705);
double r160707 = r160704 / r160706;
double r160708 = 0.5;
double r160709 = r160708 / r160697;
double r160710 = r160707 + r160709;
double r160711 = r160703 - r160710;
double r160712 = log(r160711);
double r160713 = 0.9017023301953626;
bool r160714 = r160697 <= r160713;
double r160715 = 1.0;
double r160716 = sqrt(r160715);
double r160717 = pow(r160716, r160701);
double r160718 = r160702 / r160717;
double r160719 = -0.16666666666666666;
double r160720 = log(r160716);
double r160721 = r160697 / r160716;
double r160722 = r160720 + r160721;
double r160723 = fma(r160718, r160719, r160722);
double r160724 = 2.0;
double r160725 = r160709 - r160703;
double r160726 = fma(r160724, r160697, r160725);
double r160727 = log(r160726);
double r160728 = r160714 ? r160723 : r160727;
double r160729 = r160699 ? r160712 : r160728;
return r160729;
}




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
Simplified0.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)))))