\log \left(x + \sqrt{x \cdot x + 1}\right)\begin{array}{l}
\mathbf{if}\;x \le -0.999169964539547206:\\
\;\;\;\;\log \left(\frac{0.125}{{x}^{3}} - \left(\frac{0.5}{x} - \frac{-0.0625}{{x}^{5}}\right)\right)\\
\mathbf{elif}\;x \le 0.00104093371215789056:\\
\;\;\;\;\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(1 \cdot \left(\mathsf{hypot}\left(x, \sqrt{1}\right) + x\right)\right)\\
\end{array}double f(double x) {
double r211308 = x;
double r211309 = r211308 * r211308;
double r211310 = 1.0;
double r211311 = r211309 + r211310;
double r211312 = sqrt(r211311);
double r211313 = r211308 + r211312;
double r211314 = log(r211313);
return r211314;
}
double f(double x) {
double r211315 = x;
double r211316 = -0.9991699645395472;
bool r211317 = r211315 <= r211316;
double r211318 = 0.125;
double r211319 = 3.0;
double r211320 = pow(r211315, r211319);
double r211321 = r211318 / r211320;
double r211322 = 0.5;
double r211323 = r211322 / r211315;
double r211324 = 0.0625;
double r211325 = -r211324;
double r211326 = 5.0;
double r211327 = pow(r211315, r211326);
double r211328 = r211325 / r211327;
double r211329 = r211323 - r211328;
double r211330 = r211321 - r211329;
double r211331 = log(r211330);
double r211332 = 0.0010409337121578906;
bool r211333 = r211315 <= r211332;
double r211334 = 1.0;
double r211335 = sqrt(r211334);
double r211336 = log(r211335);
double r211337 = r211315 / r211335;
double r211338 = r211336 + r211337;
double r211339 = 0.16666666666666666;
double r211340 = pow(r211335, r211319);
double r211341 = r211320 / r211340;
double r211342 = r211339 * r211341;
double r211343 = r211338 - r211342;
double r211344 = 1.0;
double r211345 = hypot(r211315, r211335);
double r211346 = r211345 + r211315;
double r211347 = r211344 * r211346;
double r211348 = log(r211347);
double r211349 = r211333 ? r211343 : r211348;
double r211350 = r211317 ? r211331 : r211349;
return r211350;
}




Bits error versus x
Results
| Original | 53.1 |
|---|---|
| Target | 45.6 |
| Herbie | 0.2 |
if x < -0.9991699645395472Initial program 63.0
Taylor expanded around -inf 0.3
Simplified0.3
if -0.9991699645395472 < x < 0.0010409337121578906Initial program 58.7
Taylor expanded around 0 0.3
if 0.0010409337121578906 < x Initial program 31.8
rmApplied *-un-lft-identity31.8
Applied *-un-lft-identity31.8
Applied distribute-lft-out31.8
Simplified0.1
Final simplification0.2
herbie shell --seed 2020021 +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)))))