\log \left(x + \sqrt{x \cdot x + 1}\right)\begin{array}{l}
\mathbf{if}\;x \le -1.009816372300169629028232520795427262783:\\
\;\;\;\;\log \left(\frac{0.125}{\left(x \cdot x\right) \cdot x} - \left(\frac{0.5}{x} + \frac{0.0625}{{x}^{5}}\right)\right)\\
\mathbf{elif}\;x \le 0.001083552111994919410833948525407777196961:\\
\;\;\;\;\mathsf{fma}\left(\frac{-1}{6}, \frac{\left(x \cdot x\right) \cdot x}{1 \cdot \sqrt{1}}, \frac{x}{\sqrt{1}} + \log \left(\sqrt{1}\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\log \left(\mathsf{hypot}\left(x, \sqrt{1}\right) + x\right)\\
\end{array}double f(double x) {
double r5005038 = x;
double r5005039 = r5005038 * r5005038;
double r5005040 = 1.0;
double r5005041 = r5005039 + r5005040;
double r5005042 = sqrt(r5005041);
double r5005043 = r5005038 + r5005042;
double r5005044 = log(r5005043);
return r5005044;
}
double f(double x) {
double r5005045 = x;
double r5005046 = -1.0098163723001696;
bool r5005047 = r5005045 <= r5005046;
double r5005048 = 0.125;
double r5005049 = r5005045 * r5005045;
double r5005050 = r5005049 * r5005045;
double r5005051 = r5005048 / r5005050;
double r5005052 = 0.5;
double r5005053 = r5005052 / r5005045;
double r5005054 = 0.0625;
double r5005055 = 5.0;
double r5005056 = pow(r5005045, r5005055);
double r5005057 = r5005054 / r5005056;
double r5005058 = r5005053 + r5005057;
double r5005059 = r5005051 - r5005058;
double r5005060 = log(r5005059);
double r5005061 = 0.0010835521119949194;
bool r5005062 = r5005045 <= r5005061;
double r5005063 = -0.16666666666666666;
double r5005064 = 1.0;
double r5005065 = sqrt(r5005064);
double r5005066 = r5005064 * r5005065;
double r5005067 = r5005050 / r5005066;
double r5005068 = r5005045 / r5005065;
double r5005069 = log(r5005065);
double r5005070 = r5005068 + r5005069;
double r5005071 = fma(r5005063, r5005067, r5005070);
double r5005072 = hypot(r5005045, r5005065);
double r5005073 = r5005072 + r5005045;
double r5005074 = log(r5005073);
double r5005075 = r5005062 ? r5005071 : r5005074;
double r5005076 = r5005047 ? r5005060 : r5005075;
return r5005076;
}




Bits error versus x
| Original | 53.3 |
|---|---|
| Target | 45.5 |
| Herbie | 0.1 |
if x < -1.0098163723001696Initial program 62.8
Simplified62.8
Taylor expanded around -inf 0.2
Simplified0.2
if -1.0098163723001696 < x < 0.0010835521119949194Initial program 59.0
Simplified59.0
Taylor expanded around 0 0.1
Simplified0.1
if 0.0010835521119949194 < x Initial program 32.5
Simplified32.5
rmApplied add-log-exp32.5
Simplified0.1
Final simplification0.1
herbie shell --seed 2019171 +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)))))