\log \left(x + \sqrt{x \cdot x + 1}\right)\begin{array}{l}
\mathbf{if}\;x \le -1.0296783040954165:\\
\;\;\;\;\log \left(\frac{0.125}{{x}^{3}} - \left(\frac{0.5}{x} - \frac{-0.0625}{{x}^{5}}\right)\right)\\
\mathbf{elif}\;x \le 0.0011756572267579168:\\
\;\;\;\;\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 \left(\mathsf{fma}\left(\left|\sqrt[3]{\mathsf{hypot}\left(x, \sqrt{1}\right)}\right| \cdot \sqrt{\sqrt[3]{\mathsf{hypot}\left(x, \sqrt{1}\right)}}, \sqrt{\mathsf{hypot}\left(x, \sqrt{1}\right)}, x\right)\right)\\
\end{array}double f(double x) {
double r156924 = x;
double r156925 = r156924 * r156924;
double r156926 = 1.0;
double r156927 = r156925 + r156926;
double r156928 = sqrt(r156927);
double r156929 = r156924 + r156928;
double r156930 = log(r156929);
return r156930;
}
double f(double x) {
double r156931 = x;
double r156932 = -1.0296783040954165;
bool r156933 = r156931 <= r156932;
double r156934 = 0.125;
double r156935 = 3.0;
double r156936 = pow(r156931, r156935);
double r156937 = r156934 / r156936;
double r156938 = 0.5;
double r156939 = r156938 / r156931;
double r156940 = 0.0625;
double r156941 = -r156940;
double r156942 = 5.0;
double r156943 = pow(r156931, r156942);
double r156944 = r156941 / r156943;
double r156945 = r156939 - r156944;
double r156946 = r156937 - r156945;
double r156947 = log(r156946);
double r156948 = 0.0011756572267579168;
bool r156949 = r156931 <= r156948;
double r156950 = 1.0;
double r156951 = sqrt(r156950);
double r156952 = log(r156951);
double r156953 = r156931 / r156951;
double r156954 = r156952 + r156953;
double r156955 = 0.16666666666666666;
double r156956 = pow(r156951, r156935);
double r156957 = r156936 / r156956;
double r156958 = r156955 * r156957;
double r156959 = r156954 - r156958;
double r156960 = hypot(r156931, r156951);
double r156961 = cbrt(r156960);
double r156962 = fabs(r156961);
double r156963 = sqrt(r156961);
double r156964 = r156962 * r156963;
double r156965 = sqrt(r156960);
double r156966 = fma(r156964, r156965, r156931);
double r156967 = log(r156966);
double r156968 = r156949 ? r156959 : r156967;
double r156969 = r156933 ? r156947 : r156968;
return r156969;
}




Bits error versus x
| Original | 53.0 |
|---|---|
| Target | 45.3 |
| Herbie | 0.2 |
if x < -1.0296783040954165Initial program 62.9
Taylor expanded around -inf 0.2
Simplified0.2
if -1.0296783040954165 < x < 0.0011756572267579168Initial program 58.7
Taylor expanded around 0 0.2
if 0.0011756572267579168 < x Initial program 31.8
rmApplied add-log-exp31.8
Simplified0.1
rmApplied add-sqr-sqrt0.1
Applied fma-def0.1
rmApplied add-cube-cbrt0.1
Applied sqrt-prod0.1
Simplified0.1
Final simplification0.2
herbie shell --seed 2020057 +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)))))