\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 r85597 = x;
double r85598 = r85597 * r85597;
double r85599 = 1.0;
double r85600 = r85598 + r85599;
double r85601 = sqrt(r85600);
double r85602 = r85597 + r85601;
double r85603 = log(r85602);
return r85603;
}
double f(double x) {
double r85604 = x;
double r85605 = -1.017049376431383;
bool r85606 = r85604 <= r85605;
double r85607 = 0.125;
double r85608 = 3.0;
double r85609 = pow(r85604, r85608);
double r85610 = r85607 / r85609;
double r85611 = 0.0625;
double r85612 = 5.0;
double r85613 = pow(r85604, r85612);
double r85614 = r85611 / r85613;
double r85615 = 0.5;
double r85616 = r85615 / r85604;
double r85617 = r85614 + r85616;
double r85618 = r85610 - r85617;
double r85619 = log(r85618);
double r85620 = 0.8981400227354687;
bool r85621 = r85604 <= r85620;
double r85622 = 1.0;
double r85623 = sqrt(r85622);
double r85624 = pow(r85623, r85608);
double r85625 = r85609 / r85624;
double r85626 = -0.16666666666666666;
double r85627 = log(r85623);
double r85628 = r85604 / r85623;
double r85629 = r85627 + r85628;
double r85630 = fma(r85625, r85626, r85629);
double r85631 = 2.0;
double r85632 = r85616 - r85610;
double r85633 = fma(r85631, r85604, r85632);
double r85634 = log(r85633);
double r85635 = r85621 ? r85630 : r85634;
double r85636 = r85606 ? r85619 : r85635;
return r85636;
}




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