\log \left(x + \sqrt{x \cdot x + 1}\right)\begin{array}{l}
\mathbf{if}\;x \le -1.0090202414523164:\\
\;\;\;\;\log \left(\mathsf{fma}\left(\frac{\frac{1}{8}}{{x}^{3}}, 1 \cdot 1, \left(-\frac{1}{2}\right) \cdot \frac{1}{x} - \frac{{1}^{3}}{\frac{{x}^{5}}{\frac{1}{16}}}\right)\right)\\
\mathbf{elif}\;x \le 0.963811647786171011:\\
\;\;\;\;\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 2 - \left(\left(\frac{0.09375}{{x}^{4}} - \log x\right) - \frac{\frac{0.25}{x}}{x}\right)\\
\end{array}double f(double x) {
double r189487 = x;
double r189488 = r189487 * r189487;
double r189489 = 1.0;
double r189490 = r189488 + r189489;
double r189491 = sqrt(r189490);
double r189492 = r189487 + r189491;
double r189493 = log(r189492);
return r189493;
}
double f(double x) {
double r189494 = x;
double r189495 = -1.0090202414523164;
bool r189496 = r189494 <= r189495;
double r189497 = 0.125;
double r189498 = 3.0;
double r189499 = pow(r189494, r189498);
double r189500 = r189497 / r189499;
double r189501 = 1.0;
double r189502 = r189501 * r189501;
double r189503 = 0.5;
double r189504 = -r189503;
double r189505 = r189501 / r189494;
double r189506 = r189504 * r189505;
double r189507 = pow(r189501, r189498);
double r189508 = 5.0;
double r189509 = pow(r189494, r189508);
double r189510 = 0.0625;
double r189511 = r189509 / r189510;
double r189512 = r189507 / r189511;
double r189513 = r189506 - r189512;
double r189514 = fma(r189500, r189502, r189513);
double r189515 = log(r189514);
double r189516 = 0.963811647786171;
bool r189517 = r189494 <= r189516;
double r189518 = sqrt(r189501);
double r189519 = log(r189518);
double r189520 = r189494 / r189518;
double r189521 = r189519 + r189520;
double r189522 = 0.16666666666666666;
double r189523 = pow(r189518, r189498);
double r189524 = r189499 / r189523;
double r189525 = r189522 * r189524;
double r189526 = r189521 - r189525;
double r189527 = 2.0;
double r189528 = log(r189527);
double r189529 = 0.09375;
double r189530 = 4.0;
double r189531 = pow(r189494, r189530);
double r189532 = r189529 / r189531;
double r189533 = log(r189494);
double r189534 = r189532 - r189533;
double r189535 = 0.25;
double r189536 = r189535 / r189494;
double r189537 = r189536 / r189494;
double r189538 = r189534 - r189537;
double r189539 = r189528 - r189538;
double r189540 = r189517 ? r189526 : r189539;
double r189541 = r189496 ? r189515 : r189540;
return r189541;
}




Bits error versus x
| Original | 53.2 |
|---|---|
| Target | 45.5 |
| Herbie | 0.3 |
if x < -1.0090202414523164Initial program 62.9
rmApplied add-sqr-sqrt62.9
Applied hypot-def62.9
Taylor expanded around -inf 0.2
Simplified0.2
if -1.0090202414523164 < x < 0.963811647786171Initial program 58.7
Taylor expanded around 0 0.4
if 0.963811647786171 < x Initial program 32.3
Taylor expanded around inf 0.3
Simplified0.3
Final simplification0.3
herbie shell --seed 2020059 +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)))))