\log \left(x + \sqrt{x \cdot x + 1}\right)\begin{array}{l}
\mathbf{if}\;x \le -1.02004933856096858:\\
\;\;\;\;\log \left(\left(\frac{0.125}{{x}^{3}} - \frac{0.0625}{{x}^{5}}\right) - \frac{0.5}{x}\right)\\
\mathbf{elif}\;x \le 0.88957403075873587:\\
\;\;\;\;\mathsf{fma}\left(\frac{{x}^{3}}{{\left(\sqrt{1}\right)}^{3}}, \frac{-1}{6}, \frac{x}{\sqrt{1}} + \log \left(\sqrt{1}\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\log \left(\mathsf{fma}\left(2, x, \frac{0.5}{x} - \frac{0.125}{{x}^{3}}\right)\right)\\
\end{array}double f(double x) {
double r100253 = x;
double r100254 = r100253 * r100253;
double r100255 = 1.0;
double r100256 = r100254 + r100255;
double r100257 = sqrt(r100256);
double r100258 = r100253 + r100257;
double r100259 = log(r100258);
return r100259;
}
double f(double x) {
double r100260 = x;
double r100261 = -1.0200493385609686;
bool r100262 = r100260 <= r100261;
double r100263 = 0.125;
double r100264 = 3.0;
double r100265 = pow(r100260, r100264);
double r100266 = r100263 / r100265;
double r100267 = 0.0625;
double r100268 = 5.0;
double r100269 = pow(r100260, r100268);
double r100270 = r100267 / r100269;
double r100271 = r100266 - r100270;
double r100272 = 0.5;
double r100273 = r100272 / r100260;
double r100274 = r100271 - r100273;
double r100275 = log(r100274);
double r100276 = 0.8895740307587359;
bool r100277 = r100260 <= r100276;
double r100278 = 1.0;
double r100279 = sqrt(r100278);
double r100280 = pow(r100279, r100264);
double r100281 = r100265 / r100280;
double r100282 = -0.16666666666666666;
double r100283 = r100260 / r100279;
double r100284 = log(r100279);
double r100285 = r100283 + r100284;
double r100286 = fma(r100281, r100282, r100285);
double r100287 = 2.0;
double r100288 = r100273 - r100266;
double r100289 = fma(r100287, r100260, r100288);
double r100290 = log(r100289);
double r100291 = r100277 ? r100286 : r100290;
double r100292 = r100262 ? r100275 : r100291;
return r100292;
}




Bits error versus x
| Original | 52.9 |
|---|---|
| Target | 45.4 |
| Herbie | 0.3 |
if x < -1.0200493385609686Initial program 62.7
Simplified62.7
Taylor expanded around -inf 0.2
Simplified0.2
if -1.0200493385609686 < x < 0.8895740307587359Initial program 58.6
Simplified58.6
Taylor expanded around 0 0.3
Simplified0.3
if 0.8895740307587359 < x Initial program 31.1
Simplified31.1
Taylor expanded around inf 0.3
Simplified0.3
Final simplification0.3
herbie shell --seed 2019195 +o rules:numerics
(FPCore (x)
:name "Hyperbolic arcsine"
:herbie-target
(if (< x 0.0) (log (/ -1.0 (- x (sqrt (+ (* x x) 1.0))))) (log (+ x (sqrt (+ (* x x) 1.0)))))
(log (+ x (sqrt (+ (* x x) 1.0)))))