\log \left(x + \sqrt{x \cdot x + 1}\right)\begin{array}{l}
\mathbf{if}\;x \le -1.0772372773411123:\\
\;\;\;\;\log \left(\sqrt{\frac{\frac{-1}{16}}{{x}^{5}} + \left(\frac{\frac{\frac{1}{8}}{x}}{x \cdot x} + \frac{\frac{-1}{2}}{x}\right)}\right) + \log \left(\sqrt{\frac{\frac{-1}{16}}{{x}^{5}} + \left(\frac{\frac{\frac{1}{8}}{x}}{x \cdot x} + \frac{\frac{-1}{2}}{x}\right)}\right)\\
\mathbf{elif}\;x \le 0.9655399906543994:\\
\;\;\;\;\left(\frac{3}{40} \cdot {x}^{5} + \left(\left(x \cdot x\right) \cdot x\right) \cdot \frac{-1}{6}\right) + x\\
\mathbf{else}:\\
\;\;\;\;\log \left(\frac{x}{\frac{1}{2}} + \left(\frac{\frac{1}{2}}{x} - \frac{\frac{\frac{1}{8}}{x}}{x \cdot x}\right)\right)\\
\end{array}double f(double x) {
double r4972032 = x;
double r4972033 = r4972032 * r4972032;
double r4972034 = 1.0;
double r4972035 = r4972033 + r4972034;
double r4972036 = sqrt(r4972035);
double r4972037 = r4972032 + r4972036;
double r4972038 = log(r4972037);
return r4972038;
}
double f(double x) {
double r4972039 = x;
double r4972040 = -1.0772372773411123;
bool r4972041 = r4972039 <= r4972040;
double r4972042 = -0.0625;
double r4972043 = 5.0;
double r4972044 = pow(r4972039, r4972043);
double r4972045 = r4972042 / r4972044;
double r4972046 = 0.125;
double r4972047 = r4972046 / r4972039;
double r4972048 = r4972039 * r4972039;
double r4972049 = r4972047 / r4972048;
double r4972050 = -0.5;
double r4972051 = r4972050 / r4972039;
double r4972052 = r4972049 + r4972051;
double r4972053 = r4972045 + r4972052;
double r4972054 = sqrt(r4972053);
double r4972055 = log(r4972054);
double r4972056 = r4972055 + r4972055;
double r4972057 = 0.9655399906543994;
bool r4972058 = r4972039 <= r4972057;
double r4972059 = 0.075;
double r4972060 = r4972059 * r4972044;
double r4972061 = r4972048 * r4972039;
double r4972062 = -0.16666666666666666;
double r4972063 = r4972061 * r4972062;
double r4972064 = r4972060 + r4972063;
double r4972065 = r4972064 + r4972039;
double r4972066 = 0.5;
double r4972067 = r4972039 / r4972066;
double r4972068 = r4972066 / r4972039;
double r4972069 = r4972068 - r4972049;
double r4972070 = r4972067 + r4972069;
double r4972071 = log(r4972070);
double r4972072 = r4972058 ? r4972065 : r4972071;
double r4972073 = r4972041 ? r4972056 : r4972072;
return r4972073;
}




Bits error versus x
Results
| Original | 52.5 |
|---|---|
| Target | 45.0 |
| Herbie | 0.2 |
if x < -1.0772372773411123Initial program 61.8
Taylor expanded around -inf 0.2
Simplified0.2
rmApplied add-sqr-sqrt0.2
Applied log-prod0.2
if -1.0772372773411123 < x < 0.9655399906543994Initial program 58.5
Taylor expanded around 0 0.2
Simplified0.2
if 0.9655399906543994 < x Initial program 30.6
Taylor expanded around inf 0.2
Simplified0.2
Final simplification0.2
herbie shell --seed 2019130
(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)))))