\log \left(x + \sqrt{x \cdot x + 1}\right)\begin{array}{l}
\mathbf{if}\;x \le -1.0208992259036227:\\
\;\;\;\;\log \left(\frac{0.125}{{x}^{3}} - \left(\frac{0.5}{x} - \frac{-0.0625}{{x}^{5}}\right)\right)\\
\mathbf{elif}\;x \le 0.94854207071551944:\\
\;\;\;\;\left(\log \left(\sqrt{1}\right) + \frac{x}{\sqrt{1}}\right) - \frac{1}{6} \cdot \frac{{x}^{3}}{{\left(\sqrt{1}\right)}^{3}}\\
\mathbf{else}:\\
\;\;\;\;\log 2 - \left(\left(\frac{0.09375}{{x}^{4}} - \log x\right) - \frac{\frac{0.25}{x}}{x}\right)\\
\end{array}double f(double x) {
double r170863 = x;
double r170864 = r170863 * r170863;
double r170865 = 1.0;
double r170866 = r170864 + r170865;
double r170867 = sqrt(r170866);
double r170868 = r170863 + r170867;
double r170869 = log(r170868);
return r170869;
}
double f(double x) {
double r170870 = x;
double r170871 = -1.0208992259036227;
bool r170872 = r170870 <= r170871;
double r170873 = 0.125;
double r170874 = 3.0;
double r170875 = pow(r170870, r170874);
double r170876 = r170873 / r170875;
double r170877 = 0.5;
double r170878 = r170877 / r170870;
double r170879 = 0.0625;
double r170880 = -r170879;
double r170881 = 5.0;
double r170882 = pow(r170870, r170881);
double r170883 = r170880 / r170882;
double r170884 = r170878 - r170883;
double r170885 = r170876 - r170884;
double r170886 = log(r170885);
double r170887 = 0.9485420707155194;
bool r170888 = r170870 <= r170887;
double r170889 = 1.0;
double r170890 = sqrt(r170889);
double r170891 = log(r170890);
double r170892 = r170870 / r170890;
double r170893 = r170891 + r170892;
double r170894 = 0.16666666666666666;
double r170895 = pow(r170890, r170874);
double r170896 = r170875 / r170895;
double r170897 = r170894 * r170896;
double r170898 = r170893 - r170897;
double r170899 = 2.0;
double r170900 = log(r170899);
double r170901 = 0.09375;
double r170902 = 4.0;
double r170903 = pow(r170870, r170902);
double r170904 = r170901 / r170903;
double r170905 = log(r170870);
double r170906 = r170904 - r170905;
double r170907 = 0.25;
double r170908 = r170907 / r170870;
double r170909 = r170908 / r170870;
double r170910 = r170906 - r170909;
double r170911 = r170900 - r170910;
double r170912 = r170888 ? r170898 : r170911;
double r170913 = r170872 ? r170886 : r170912;
return r170913;
}




Bits error versus x
Results
| Original | 53.0 |
|---|---|
| Target | 45.5 |
| Herbie | 0.3 |
if x < -1.0208992259036227Initial program 63.2
Taylor expanded around -inf 0.2
Simplified0.2
if -1.0208992259036227 < x < 0.9485420707155194Initial program 58.5
Taylor expanded around 0 0.4
if 0.9485420707155194 < x Initial program 32.2
Taylor expanded around inf 0.3
Simplified0.3
Final simplification0.3
herbie shell --seed 2020089 +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)))))