\log \left(x + \sqrt{x \cdot x + 1}\right)\begin{array}{l}
\mathbf{if}\;x \le -1.008768630290992396325577828974928706884:\\
\;\;\;\;\log \left(\frac{0.125}{{x}^{3}} - \left(\frac{0.0625}{{x}^{5}} + \frac{0.5}{x}\right)\right)\\
\mathbf{elif}\;x \le 0.8844350792771517033585837452847044914961:\\
\;\;\;\;\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 r123781 = x;
double r123782 = r123781 * r123781;
double r123783 = 1.0;
double r123784 = r123782 + r123783;
double r123785 = sqrt(r123784);
double r123786 = r123781 + r123785;
double r123787 = log(r123786);
return r123787;
}
double f(double x) {
double r123788 = x;
double r123789 = -1.0087686302909924;
bool r123790 = r123788 <= r123789;
double r123791 = 0.125;
double r123792 = 3.0;
double r123793 = pow(r123788, r123792);
double r123794 = r123791 / r123793;
double r123795 = 0.0625;
double r123796 = 5.0;
double r123797 = pow(r123788, r123796);
double r123798 = r123795 / r123797;
double r123799 = 0.5;
double r123800 = r123799 / r123788;
double r123801 = r123798 + r123800;
double r123802 = r123794 - r123801;
double r123803 = log(r123802);
double r123804 = 0.8844350792771517;
bool r123805 = r123788 <= r123804;
double r123806 = 1.0;
double r123807 = sqrt(r123806);
double r123808 = pow(r123807, r123792);
double r123809 = r123793 / r123808;
double r123810 = -0.16666666666666666;
double r123811 = log(r123807);
double r123812 = r123788 / r123807;
double r123813 = r123811 + r123812;
double r123814 = fma(r123809, r123810, r123813);
double r123815 = 2.0;
double r123816 = r123800 - r123794;
double r123817 = fma(r123815, r123788, r123816);
double r123818 = log(r123817);
double r123819 = r123805 ? r123814 : r123818;
double r123820 = r123790 ? r123803 : r123819;
return r123820;
}




Bits error versus x
| Original | 52.9 |
|---|---|
| Target | 45.3 |
| Herbie | 0.2 |
if x < -1.0087686302909924Initial program 62.7
Simplified62.7
Taylor expanded around -inf 0.2
Simplified0.2
if -1.0087686302909924 < x < 0.8844350792771517Initial program 58.7
Simplified58.7
Taylor expanded around 0 0.3
Simplified0.3
if 0.8844350792771517 < x Initial program 33.0
Simplified33.0
Taylor expanded around inf 0.2
Simplified0.2
Final simplification0.2
herbie shell --seed 2019209 +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)))))