\log \left(x + \sqrt{x \cdot x + 1}\right)\begin{array}{l}
\mathbf{if}\;x \le -1.002275654089841649962977498944383114576:\\
\;\;\;\;\log \left(\left(\frac{0.125}{{x}^{3}} - \frac{0.5}{x}\right) - \frac{0.0625}{{x}^{5}}\right)\\
\mathbf{elif}\;x \le 0.8884086436842496548038639048172626644373:\\
\;\;\;\;\mathsf{fma}\left(\frac{\frac{{x}^{3}}{1}}{\sqrt{1}}, \frac{-1}{6}, \frac{x}{\sqrt{1}} + \log \left(\sqrt{1}\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\log \left(\mathsf{fma}\left(x, 2, \frac{0.5}{x}\right) - \frac{0.125}{{x}^{3}}\right)\\
\end{array}double f(double x) {
double r189971 = x;
double r189972 = r189971 * r189971;
double r189973 = 1.0;
double r189974 = r189972 + r189973;
double r189975 = sqrt(r189974);
double r189976 = r189971 + r189975;
double r189977 = log(r189976);
return r189977;
}
double f(double x) {
double r189978 = x;
double r189979 = -1.0022756540898416;
bool r189980 = r189978 <= r189979;
double r189981 = 0.125;
double r189982 = 3.0;
double r189983 = pow(r189978, r189982);
double r189984 = r189981 / r189983;
double r189985 = 0.5;
double r189986 = r189985 / r189978;
double r189987 = r189984 - r189986;
double r189988 = 0.0625;
double r189989 = 5.0;
double r189990 = pow(r189978, r189989);
double r189991 = r189988 / r189990;
double r189992 = r189987 - r189991;
double r189993 = log(r189992);
double r189994 = 0.8884086436842497;
bool r189995 = r189978 <= r189994;
double r189996 = 1.0;
double r189997 = r189983 / r189996;
double r189998 = sqrt(r189996);
double r189999 = r189997 / r189998;
double r190000 = -0.16666666666666666;
double r190001 = r189978 / r189998;
double r190002 = log(r189998);
double r190003 = r190001 + r190002;
double r190004 = fma(r189999, r190000, r190003);
double r190005 = 2.0;
double r190006 = fma(r189978, r190005, r189986);
double r190007 = r190006 - r189984;
double r190008 = log(r190007);
double r190009 = r189995 ? r190004 : r190008;
double r190010 = r189980 ? r189993 : r190009;
return r190010;
}




Bits error versus x
| Original | 52.8 |
|---|---|
| Target | 45.0 |
| Herbie | 0.2 |
if x < -1.0022756540898416Initial program 63.1
Simplified63.1
Taylor expanded around -inf 0.1
Simplified0.1
if -1.0022756540898416 < x < 0.8884086436842497Initial program 58.7
Simplified58.7
Taylor expanded around 0 0.3
Simplified0.3
if 0.8884086436842497 < x Initial program 31.4
Simplified31.4
Taylor expanded around inf 0.3
Simplified0.3
Final simplification0.2
herbie shell --seed 2019194 +o rules:numerics
(FPCore (x)
:name "Hyperbolic arcsine"
:herbie-target
(if (< x 0.0) (log (/ -1.0 (- x (sqrt (+ (* x x) 1.0))))) (log (+ x (sqrt (+ (* x x) 1.0)))))
(log (+ x (sqrt (+ (* x x) 1.0)))))