\log \left(x + \sqrt{x \cdot x + 1}\right)\begin{array}{l}
\mathbf{if}\;x \le -1.0589513033049822:\\
\;\;\;\;\log \left(\mathsf{fma}\left(\left(\frac{1}{x}\right), \left(\frac{\frac{1}{8}}{x \cdot x} - \frac{1}{2}\right), \left(\frac{\frac{-1}{16}}{{x}^{5}}\right)\right)\right)\\
\mathbf{elif}\;x \le 0.007287090423348713:\\
\;\;\;\;\mathsf{fma}\left(\frac{-1}{6}, \left(x \cdot \left(x \cdot x\right)\right), \left(\mathsf{fma}\left(\frac{3}{40}, \left({x}^{5}\right), x\right)\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\log \left(\mathsf{hypot}\left(1, x\right) + x\right)\\
\end{array}double f(double x) {
double r5782820 = x;
double r5782821 = r5782820 * r5782820;
double r5782822 = 1.0;
double r5782823 = r5782821 + r5782822;
double r5782824 = sqrt(r5782823);
double r5782825 = r5782820 + r5782824;
double r5782826 = log(r5782825);
return r5782826;
}
double f(double x) {
double r5782827 = x;
double r5782828 = -1.0589513033049822;
bool r5782829 = r5782827 <= r5782828;
double r5782830 = 1.0;
double r5782831 = r5782830 / r5782827;
double r5782832 = 0.125;
double r5782833 = r5782827 * r5782827;
double r5782834 = r5782832 / r5782833;
double r5782835 = 0.5;
double r5782836 = r5782834 - r5782835;
double r5782837 = -0.0625;
double r5782838 = 5.0;
double r5782839 = pow(r5782827, r5782838);
double r5782840 = r5782837 / r5782839;
double r5782841 = fma(r5782831, r5782836, r5782840);
double r5782842 = log(r5782841);
double r5782843 = 0.007287090423348713;
bool r5782844 = r5782827 <= r5782843;
double r5782845 = -0.16666666666666666;
double r5782846 = r5782827 * r5782833;
double r5782847 = 0.075;
double r5782848 = fma(r5782847, r5782839, r5782827);
double r5782849 = fma(r5782845, r5782846, r5782848);
double r5782850 = hypot(r5782830, r5782827);
double r5782851 = r5782850 + r5782827;
double r5782852 = log(r5782851);
double r5782853 = r5782844 ? r5782849 : r5782852;
double r5782854 = r5782829 ? r5782842 : r5782853;
return r5782854;
}




Bits error versus x
| Original | 52.4 |
|---|---|
| Target | 44.7 |
| Herbie | 0.1 |
if x < -1.0589513033049822Initial program 62.1
Simplified61.3
Taylor expanded around -inf 0.1
Simplified0.1
if -1.0589513033049822 < x < 0.007287090423348713Initial program 58.7
Simplified58.7
Taylor expanded around 0 0.1
Simplified0.1
if 0.007287090423348713 < x Initial program 31.6
Simplified0.0
rmApplied expm1-log1p-u0.0
rmApplied add-log-exp0.0
Simplified0.0
Final simplification0.1
herbie shell --seed 2019133 +o rules:numerics
(FPCore (x)
:name "Hyperbolic arcsine"
:herbie-target
(if (< x 0) (log (/ -1 (- x (sqrt (+ (* x x) 1))))) (log (+ x (sqrt (+ (* x x) 1)))))
(log (+ x (sqrt (+ (* x x) 1)))))