\log \left(x + \sqrt{x \cdot x + 1}\right)\begin{array}{l}
\mathbf{if}\;x \le -0.9941877870754349810766825612518005073071:\\
\;\;\;\;\log \left(\left(\frac{0.125}{{x}^{3}} - \frac{0.5}{x}\right) - \frac{0.0625}{{x}^{5}}\right)\\
\mathbf{elif}\;x \le 0.9042263775546853787901113719271961599588:\\
\;\;\;\;\mathsf{fma}\left(\frac{-1}{6}, \frac{{x}^{3}}{{\left(\sqrt{1}\right)}^{3}}, \log \left(\sqrt{1}\right) + \frac{x}{\sqrt{1}}\right)\\
\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 r157749 = x;
double r157750 = r157749 * r157749;
double r157751 = 1.0;
double r157752 = r157750 + r157751;
double r157753 = sqrt(r157752);
double r157754 = r157749 + r157753;
double r157755 = log(r157754);
return r157755;
}
double f(double x) {
double r157756 = x;
double r157757 = -0.994187787075435;
bool r157758 = r157756 <= r157757;
double r157759 = 0.125;
double r157760 = 3.0;
double r157761 = pow(r157756, r157760);
double r157762 = r157759 / r157761;
double r157763 = 0.5;
double r157764 = r157763 / r157756;
double r157765 = r157762 - r157764;
double r157766 = 0.0625;
double r157767 = 5.0;
double r157768 = pow(r157756, r157767);
double r157769 = r157766 / r157768;
double r157770 = r157765 - r157769;
double r157771 = log(r157770);
double r157772 = 0.9042263775546854;
bool r157773 = r157756 <= r157772;
double r157774 = -0.16666666666666666;
double r157775 = 1.0;
double r157776 = sqrt(r157775);
double r157777 = pow(r157776, r157760);
double r157778 = r157761 / r157777;
double r157779 = log(r157776);
double r157780 = r157756 / r157776;
double r157781 = r157779 + r157780;
double r157782 = fma(r157774, r157778, r157781);
double r157783 = 2.0;
double r157784 = r157764 - r157762;
double r157785 = fma(r157756, r157783, r157784);
double r157786 = log(r157785);
double r157787 = r157773 ? r157782 : r157786;
double r157788 = r157758 ? r157771 : r157787;
return r157788;
}




Bits error versus x
| Original | 53.1 |
|---|---|
| Target | 45.6 |
| Herbie | 0.3 |
if x < -0.994187787075435Initial program 62.7
Taylor expanded around -inf 0.3
Simplified0.3
if -0.994187787075435 < x < 0.9042263775546854Initial program 58.6
Taylor expanded around 0 0.4
Simplified0.4
if 0.9042263775546854 < x Initial program 33.0
Taylor expanded around inf 0.1
Simplified0.1
Final simplification0.3
herbie shell --seed 2019212 +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)))))