\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(\left(\left(\frac{0.5}{x} - \frac{0.125}{{x}^{3}}\right) + x\right) + x\right)\\
\end{array}double f(double x) {
double r117782 = x;
double r117783 = r117782 * r117782;
double r117784 = 1.0;
double r117785 = r117783 + r117784;
double r117786 = sqrt(r117785);
double r117787 = r117782 + r117786;
double r117788 = log(r117787);
return r117788;
}
double f(double x) {
double r117789 = x;
double r117790 = -1.002814715336328;
bool r117791 = r117789 <= r117790;
double r117792 = 0.125;
double r117793 = 3.0;
double r117794 = pow(r117789, r117793);
double r117795 = r117792 / r117794;
double r117796 = 0.0625;
double r117797 = 5.0;
double r117798 = pow(r117789, r117797);
double r117799 = r117796 / r117798;
double r117800 = 0.5;
double r117801 = r117800 / r117789;
double r117802 = r117799 + r117801;
double r117803 = r117795 - r117802;
double r117804 = log(r117803);
double r117805 = 0.9017023301953626;
bool r117806 = r117789 <= r117805;
double r117807 = 1.0;
double r117808 = sqrt(r117807);
double r117809 = pow(r117808, r117793);
double r117810 = r117794 / r117809;
double r117811 = -0.16666666666666666;
double r117812 = log(r117808);
double r117813 = r117789 / r117808;
double r117814 = r117812 + r117813;
double r117815 = fma(r117810, r117811, r117814);
double r117816 = r117801 - r117795;
double r117817 = r117816 + r117789;
double r117818 = r117817 + r117789;
double r117819 = log(r117818);
double r117820 = r117806 ? r117815 : r117819;
double r117821 = r117791 ? r117804 : r117820;
return r117821;
}




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