\log \left(x + \sqrt{x \cdot x + 1}\right)\begin{array}{l}
\mathbf{if}\;x \le -1.017049376431383045371603657258674502373:\\
\;\;\;\;\log \left(\frac{0.125}{{x}^{3}} - \left(\frac{0.0625}{{x}^{5}} + \frac{0.5}{x}\right)\right)\\
\mathbf{elif}\;x \le 0.8981400227354686682801343522442039102316:\\
\;\;\;\;\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 r103739 = x;
double r103740 = r103739 * r103739;
double r103741 = 1.0;
double r103742 = r103740 + r103741;
double r103743 = sqrt(r103742);
double r103744 = r103739 + r103743;
double r103745 = log(r103744);
return r103745;
}
double f(double x) {
double r103746 = x;
double r103747 = -1.017049376431383;
bool r103748 = r103746 <= r103747;
double r103749 = 0.125;
double r103750 = 3.0;
double r103751 = pow(r103746, r103750);
double r103752 = r103749 / r103751;
double r103753 = 0.0625;
double r103754 = 5.0;
double r103755 = pow(r103746, r103754);
double r103756 = r103753 / r103755;
double r103757 = 0.5;
double r103758 = r103757 / r103746;
double r103759 = r103756 + r103758;
double r103760 = r103752 - r103759;
double r103761 = log(r103760);
double r103762 = 0.8981400227354687;
bool r103763 = r103746 <= r103762;
double r103764 = 1.0;
double r103765 = sqrt(r103764);
double r103766 = pow(r103765, r103750);
double r103767 = r103751 / r103766;
double r103768 = -0.16666666666666666;
double r103769 = log(r103765);
double r103770 = r103746 / r103765;
double r103771 = r103769 + r103770;
double r103772 = fma(r103767, r103768, r103771);
double r103773 = 2.0;
double r103774 = r103758 - r103752;
double r103775 = fma(r103773, r103746, r103774);
double r103776 = log(r103775);
double r103777 = r103763 ? r103772 : r103776;
double r103778 = r103748 ? r103761 : r103777;
return r103778;
}




Bits error versus x
| Original | 53.3 |
|---|---|
| Target | 45.4 |
| Herbie | 0.3 |
if x < -1.017049376431383Initial program 62.8
Simplified62.8
Taylor expanded around -inf 0.2
Simplified0.2
if -1.017049376431383 < x < 0.8981400227354687Initial program 58.6
Simplified58.6
Taylor expanded around 0 0.3
Simplified0.3
if 0.8981400227354687 < x Initial program 32.2
Simplified32.2
Taylor expanded around inf 0.2
Simplified0.2
Final simplification0.3
herbie shell --seed 2019303 +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)))))