\log \left(x + \sqrt{x \cdot x + 1}\right)\begin{array}{l}
\mathbf{if}\;x \le -1.0593607199305546:\\
\;\;\;\;\log \left(\left(\frac{\frac{\frac{\frac{1}{8}}{x}}{x}}{x} + \frac{\frac{-1}{2}}{x}\right) - \frac{\frac{1}{16}}{{x}^{5}}\right)\\
\mathbf{elif}\;x \le 0.9482022957657377:\\
\;\;\;\;{x}^{5} \cdot \frac{3}{40} + \left(x + x \cdot \left(\left(x \cdot x\right) \cdot \frac{-1}{6}\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\log \left(x + \left(\frac{\frac{1}{2}}{x} + \left(x + \frac{\frac{-1}{8}}{x \cdot \left(x \cdot x\right)}\right)\right)\right)\\
\end{array}double f(double x) {
double r37193048 = x;
double r37193049 = r37193048 * r37193048;
double r37193050 = 1.0;
double r37193051 = r37193049 + r37193050;
double r37193052 = sqrt(r37193051);
double r37193053 = r37193048 + r37193052;
double r37193054 = log(r37193053);
return r37193054;
}
double f(double x) {
double r37193055 = x;
double r37193056 = -1.0593607199305546;
bool r37193057 = r37193055 <= r37193056;
double r37193058 = 0.125;
double r37193059 = r37193058 / r37193055;
double r37193060 = r37193059 / r37193055;
double r37193061 = r37193060 / r37193055;
double r37193062 = -0.5;
double r37193063 = r37193062 / r37193055;
double r37193064 = r37193061 + r37193063;
double r37193065 = 0.0625;
double r37193066 = 5.0;
double r37193067 = pow(r37193055, r37193066);
double r37193068 = r37193065 / r37193067;
double r37193069 = r37193064 - r37193068;
double r37193070 = log(r37193069);
double r37193071 = 0.9482022957657377;
bool r37193072 = r37193055 <= r37193071;
double r37193073 = 0.075;
double r37193074 = r37193067 * r37193073;
double r37193075 = r37193055 * r37193055;
double r37193076 = -0.16666666666666666;
double r37193077 = r37193075 * r37193076;
double r37193078 = r37193055 * r37193077;
double r37193079 = r37193055 + r37193078;
double r37193080 = r37193074 + r37193079;
double r37193081 = 0.5;
double r37193082 = r37193081 / r37193055;
double r37193083 = -0.125;
double r37193084 = r37193055 * r37193075;
double r37193085 = r37193083 / r37193084;
double r37193086 = r37193055 + r37193085;
double r37193087 = r37193082 + r37193086;
double r37193088 = r37193055 + r37193087;
double r37193089 = log(r37193088);
double r37193090 = r37193072 ? r37193080 : r37193089;
double r37193091 = r37193057 ? r37193070 : r37193090;
return r37193091;
}




Bits error versus x
Results
| Original | 52.0 |
|---|---|
| Target | 44.4 |
| Herbie | 0.2 |
if x < -1.0593607199305546Initial program 61.6
Taylor expanded around -inf 0.3
Simplified0.3
if -1.0593607199305546 < x < 0.9482022957657377Initial program 58.4
Taylor expanded around 0 0.2
Simplified0.2
if 0.9482022957657377 < x Initial program 30.5
Taylor expanded around inf 0.2
Simplified0.2
Final simplification0.2
herbie shell --seed 2019120
(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)))))