\log \left(x + \sqrt{x \cdot x + 1}\right)\begin{array}{l}
\mathbf{if}\;x \le -1.02867483106351787:\\
\;\;\;\;\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 9.30222189011167149 \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 r185201 = x;
double r185202 = r185201 * r185201;
double r185203 = 1.0;
double r185204 = r185202 + r185203;
double r185205 = sqrt(r185204);
double r185206 = r185201 + r185205;
double r185207 = log(r185206);
return r185207;
}
double f(double x) {
double r185208 = x;
double r185209 = -1.0286748310635179;
bool r185210 = r185208 <= r185209;
double r185211 = 0.125;
double r185212 = 3.0;
double r185213 = pow(r185208, r185212);
double r185214 = r185211 / r185213;
double r185215 = 1.0;
double r185216 = r185215 * r185215;
double r185217 = 0.5;
double r185218 = -r185217;
double r185219 = r185215 / r185208;
double r185220 = r185218 * r185219;
double r185221 = pow(r185215, r185212);
double r185222 = 5.0;
double r185223 = pow(r185208, r185222);
double r185224 = 0.0625;
double r185225 = r185223 / r185224;
double r185226 = r185221 / r185225;
double r185227 = r185220 - r185226;
double r185228 = fma(r185214, r185216, r185227);
double r185229 = log(r185228);
double r185230 = 0.0009302221890111671;
bool r185231 = r185208 <= r185230;
double r185232 = sqrt(r185215);
double r185233 = log(r185232);
double r185234 = r185208 / r185232;
double r185235 = r185233 + r185234;
double r185236 = 0.16666666666666666;
double r185237 = pow(r185232, r185212);
double r185238 = r185213 / r185237;
double r185239 = r185236 * r185238;
double r185240 = r185235 - r185239;
double r185241 = hypot(r185208, r185232);
double r185242 = r185241 + r185208;
double r185243 = log(r185242);
double r185244 = r185231 ? r185240 : r185243;
double r185245 = r185210 ? r185229 : r185244;
return r185245;
}




Bits error versus x
| Original | 53.3 |
|---|---|
| Target | 45.6 |
| Herbie | 0.2 |
if x < -1.0286748310635179Initial program 63.0
rmApplied add-log-exp63.0
Simplified63.0
Taylor expanded around -inf 0.1
Simplified0.1
if -1.0286748310635179 < x < 0.0009302221890111671Initial program 59.0
Taylor expanded around 0 0.2
if 0.0009302221890111671 < x Initial program 32.1
rmApplied add-log-exp32.1
Simplified0.2
Final simplification0.2
herbie shell --seed 2020024 +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)))))