\log \left(x + \sqrt{x \cdot x + 1}\right)\begin{array}{l}
\mathbf{if}\;x \le -0.9982267368695869613759441563161090016365:\\
\;\;\;\;\log \left(\frac{0.125}{{x}^{3}} - \left(\frac{0.0625}{{x}^{5}} + \frac{0.5}{x}\right)\right)\\
\mathbf{elif}\;x \le 0.9479026978334682551619039259094279259443:\\
\;\;\;\;\mathsf{fma}\left(\frac{{x}^{3}}{{\left(\sqrt{1}\right)}^{3}}, \frac{-1}{6}, \log \left(\sqrt{1}\right) + \frac{x}{\sqrt{1}}\right)\\
\mathbf{else}:\\
\;\;\;\;\left(\log 2 + \frac{0.25}{x \cdot x}\right) - \left(\frac{0.09375}{{x}^{4}} - \log x\right)\\
\end{array}double f(double x) {
double r153682 = x;
double r153683 = r153682 * r153682;
double r153684 = 1.0;
double r153685 = r153683 + r153684;
double r153686 = sqrt(r153685);
double r153687 = r153682 + r153686;
double r153688 = log(r153687);
return r153688;
}
double f(double x) {
double r153689 = x;
double r153690 = -0.998226736869587;
bool r153691 = r153689 <= r153690;
double r153692 = 0.125;
double r153693 = 3.0;
double r153694 = pow(r153689, r153693);
double r153695 = r153692 / r153694;
double r153696 = 0.0625;
double r153697 = 5.0;
double r153698 = pow(r153689, r153697);
double r153699 = r153696 / r153698;
double r153700 = 0.5;
double r153701 = r153700 / r153689;
double r153702 = r153699 + r153701;
double r153703 = r153695 - r153702;
double r153704 = log(r153703);
double r153705 = 0.9479026978334683;
bool r153706 = r153689 <= r153705;
double r153707 = 1.0;
double r153708 = sqrt(r153707);
double r153709 = pow(r153708, r153693);
double r153710 = r153694 / r153709;
double r153711 = -0.16666666666666666;
double r153712 = log(r153708);
double r153713 = r153689 / r153708;
double r153714 = r153712 + r153713;
double r153715 = fma(r153710, r153711, r153714);
double r153716 = 2.0;
double r153717 = log(r153716);
double r153718 = 0.25;
double r153719 = r153689 * r153689;
double r153720 = r153718 / r153719;
double r153721 = r153717 + r153720;
double r153722 = 0.09375;
double r153723 = 4.0;
double r153724 = pow(r153689, r153723);
double r153725 = r153722 / r153724;
double r153726 = log(r153689);
double r153727 = r153725 - r153726;
double r153728 = r153721 - r153727;
double r153729 = r153706 ? r153715 : r153728;
double r153730 = r153691 ? r153704 : r153729;
return r153730;
}




Bits error versus x
| Original | 53.0 |
|---|---|
| Target | 45.4 |
| Herbie | 0.3 |
if x < -0.998226736869587Initial program 62.6
Simplified62.6
Taylor expanded around -inf 0.3
Simplified0.3
if -0.998226736869587 < x < 0.9479026978334683Initial program 58.7
Simplified58.7
Taylor expanded around 0 0.3
Simplified0.3
if 0.9479026978334683 < x Initial program 31.9
Simplified31.9
Taylor expanded around inf 0.3
Simplified0.3
Final simplification0.3
herbie shell --seed 2019304 +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)))))