\log \left(x + \sqrt{x \cdot x + 1}\right)\begin{array}{l}
\mathbf{if}\;x \le -1.01388042333944495:\\
\;\;\;\;\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 6.40100298433776281 \cdot 10^{-4}:\\
\;\;\;\;\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(\mathsf{hypot}\left(x, \sqrt{1}\right) + x\right)\\
\end{array}double f(double x) {
double r181131 = x;
double r181132 = r181131 * r181131;
double r181133 = 1.0;
double r181134 = r181132 + r181133;
double r181135 = sqrt(r181134);
double r181136 = r181131 + r181135;
double r181137 = log(r181136);
return r181137;
}
double f(double x) {
double r181138 = x;
double r181139 = -1.013880423339445;
bool r181140 = r181138 <= r181139;
double r181141 = 0.125;
double r181142 = 3.0;
double r181143 = pow(r181138, r181142);
double r181144 = r181141 / r181143;
double r181145 = 1.0;
double r181146 = r181145 * r181145;
double r181147 = 0.5;
double r181148 = -r181147;
double r181149 = r181145 / r181138;
double r181150 = r181148 * r181149;
double r181151 = pow(r181145, r181142);
double r181152 = 5.0;
double r181153 = pow(r181138, r181152);
double r181154 = 0.0625;
double r181155 = r181153 / r181154;
double r181156 = r181151 / r181155;
double r181157 = r181150 - r181156;
double r181158 = fma(r181144, r181146, r181157);
double r181159 = log(r181158);
double r181160 = 0.0006401002984337763;
bool r181161 = r181138 <= r181160;
double r181162 = sqrt(r181145);
double r181163 = log(r181162);
double r181164 = r181138 / r181162;
double r181165 = r181163 + r181164;
double r181166 = 0.16666666666666666;
double r181167 = pow(r181162, r181142);
double r181168 = r181143 / r181167;
double r181169 = r181166 * r181168;
double r181170 = r181165 - r181169;
double r181171 = hypot(r181138, r181162);
double r181172 = r181171 + r181138;
double r181173 = log(r181172);
double r181174 = r181161 ? r181170 : r181173;
double r181175 = r181140 ? r181159 : r181174;
return r181175;
}




Bits error versus x
| Original | 53.2 |
|---|---|
| Target | 45.1 |
| Herbie | 0.2 |
if x < -1.013880423339445Initial program 63.1
rmApplied add-log-exp63.1
Simplified63.1
Taylor expanded around -inf 0.2
Simplified0.2
if -1.013880423339445 < x < 0.0006401002984337763Initial program 59.0
Taylor expanded around 0 0.2
if 0.0006401002984337763 < x Initial program 32.5
rmApplied add-log-exp32.5
Simplified0.1
Final simplification0.2
herbie shell --seed 2020065 +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)))))