\log \left(x + \sqrt{x \cdot x + 1}\right)\begin{array}{l}
\mathbf{if}\;x \le -1.0593607199305546:\\
\;\;\;\;\log \left(\frac{\frac{\frac{1}{8}}{x}}{x \cdot x} - \left(\frac{\frac{1}{2}}{x} + \frac{\frac{1}{16}}{{x}^{5}}\right)\right)\\
\mathbf{elif}\;x \le 0.004359746085169371:\\
\;\;\;\;\mathsf{fma}\left(\left(x \cdot \frac{-1}{6}\right), \left(x \cdot x\right), \left(\mathsf{fma}\left(\frac{3}{40}, \left({x}^{5}\right), x\right)\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\log \left(\sqrt{\mathsf{hypot}\left(1, x\right) + x}\right) + \log \left(\sqrt{\mathsf{hypot}\left(1, x\right) + x}\right)\\
\end{array}double f(double x) {
double r27031884 = x;
double r27031885 = r27031884 * r27031884;
double r27031886 = 1.0;
double r27031887 = r27031885 + r27031886;
double r27031888 = sqrt(r27031887);
double r27031889 = r27031884 + r27031888;
double r27031890 = log(r27031889);
return r27031890;
}
double f(double x) {
double r27031891 = x;
double r27031892 = -1.0593607199305546;
bool r27031893 = r27031891 <= r27031892;
double r27031894 = 0.125;
double r27031895 = r27031894 / r27031891;
double r27031896 = r27031891 * r27031891;
double r27031897 = r27031895 / r27031896;
double r27031898 = 0.5;
double r27031899 = r27031898 / r27031891;
double r27031900 = 0.0625;
double r27031901 = 5.0;
double r27031902 = pow(r27031891, r27031901);
double r27031903 = r27031900 / r27031902;
double r27031904 = r27031899 + r27031903;
double r27031905 = r27031897 - r27031904;
double r27031906 = log(r27031905);
double r27031907 = 0.004359746085169371;
bool r27031908 = r27031891 <= r27031907;
double r27031909 = -0.16666666666666666;
double r27031910 = r27031891 * r27031909;
double r27031911 = 0.075;
double r27031912 = fma(r27031911, r27031902, r27031891);
double r27031913 = fma(r27031910, r27031896, r27031912);
double r27031914 = 1.0;
double r27031915 = hypot(r27031914, r27031891);
double r27031916 = r27031915 + r27031891;
double r27031917 = sqrt(r27031916);
double r27031918 = log(r27031917);
double r27031919 = r27031918 + r27031918;
double r27031920 = r27031908 ? r27031913 : r27031919;
double r27031921 = r27031893 ? r27031906 : r27031920;
return r27031921;
}




Bits error versus x
| Original | 52.0 |
|---|---|
| Target | 44.4 |
| Herbie | 0.2 |
if x < -1.0593607199305546Initial program 61.6
Simplified60.8
Taylor expanded around -inf 0.3
Simplified0.3
if -1.0593607199305546 < x < 0.004359746085169371Initial program 58.6
Simplified58.6
Taylor expanded around 0 0.1
Simplified0.1
if 0.004359746085169371 < x Initial program 30.3
Simplified0.1
rmApplied add-sqr-sqrt0.1
Applied log-prod0.1
Final simplification0.2
herbie shell --seed 2019120 +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)))))