\log \left(x + \sqrt{x \cdot x + 1}\right)\begin{array}{l}
\mathbf{if}\;x \le -1.0840635159626253:\\
\;\;\;\;\log \left(\frac{\frac{-1}{2}}{x} + \left(\frac{\frac{\frac{1}{8}}{x \cdot x}}{x} - \frac{\frac{1}{16}}{{x}^{5}}\right)\right)\\
\mathbf{elif}\;x \le 0.007778482819478155:\\
\;\;\;\;\mathsf{fma}\left({x}^{5}, \frac{3}{40}, \mathsf{fma}\left(x \cdot \left(x \cdot x\right), \frac{-1}{6}, x\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\log \left(\mathsf{hypot}\left(1, x\right) + x\right)\\
\end{array}double f(double x) {
double r7674887 = x;
double r7674888 = r7674887 * r7674887;
double r7674889 = 1.0;
double r7674890 = r7674888 + r7674889;
double r7674891 = sqrt(r7674890);
double r7674892 = r7674887 + r7674891;
double r7674893 = log(r7674892);
return r7674893;
}
double f(double x) {
double r7674894 = x;
double r7674895 = -1.0840635159626253;
bool r7674896 = r7674894 <= r7674895;
double r7674897 = -0.5;
double r7674898 = r7674897 / r7674894;
double r7674899 = 0.125;
double r7674900 = r7674894 * r7674894;
double r7674901 = r7674899 / r7674900;
double r7674902 = r7674901 / r7674894;
double r7674903 = 0.0625;
double r7674904 = 5.0;
double r7674905 = pow(r7674894, r7674904);
double r7674906 = r7674903 / r7674905;
double r7674907 = r7674902 - r7674906;
double r7674908 = r7674898 + r7674907;
double r7674909 = log(r7674908);
double r7674910 = 0.007778482819478155;
bool r7674911 = r7674894 <= r7674910;
double r7674912 = 0.075;
double r7674913 = r7674894 * r7674900;
double r7674914 = -0.16666666666666666;
double r7674915 = fma(r7674913, r7674914, r7674894);
double r7674916 = fma(r7674905, r7674912, r7674915);
double r7674917 = 1.0;
double r7674918 = hypot(r7674917, r7674894);
double r7674919 = r7674918 + r7674894;
double r7674920 = log(r7674919);
double r7674921 = r7674911 ? r7674916 : r7674920;
double r7674922 = r7674896 ? r7674909 : r7674921;
return r7674922;
}




Bits error versus x
| Original | 52.7 |
|---|---|
| Target | 44.8 |
| Herbie | 0.1 |
if x < -1.0840635159626253Initial program 61.8
Simplified61.0
Taylor expanded around -inf 0.2
Simplified0.2
if -1.0840635159626253 < x < 0.007778482819478155Initial program 58.6
Simplified58.6
Taylor expanded around 0 0.2
Simplified0.2
if 0.007778482819478155 < x Initial program 32.1
Simplified0.1
Final simplification0.1
herbie shell --seed 2019163 +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)))))