\log \left(x + \sqrt{x \cdot x + 1}\right)\begin{array}{l}
\mathbf{if}\;x \leq -1.042983533250168:\\
\;\;\;\;\log \left(\frac{0.125}{{x}^{3}} - \left(\frac{0.5}{x} + \frac{0.0625}{{x}^{5}}\right)\right)\\
\mathbf{elif}\;x \leq 0.9609921084103406:\\
\;\;\;\;\left(x + \left(0.075 \cdot {\left(\sqrt[3]{x} \cdot \sqrt[3]{x}\right)}^{5}\right) \cdot {\left(\sqrt[3]{x}\right)}^{5}\right) + {x}^{3} \cdot -0.16666666666666666\\
\mathbf{else}:\\
\;\;\;\;\log \left(\left(\frac{0.5}{x} + \left(x + x\right)\right) - \frac{0.125}{{x}^{3}}\right)\\
\end{array}(FPCore (x) :precision binary64 (log (+ x (sqrt (+ (* x x) 1.0)))))
(FPCore (x)
:precision binary64
(if (<= x -1.042983533250168)
(log (- (/ 0.125 (pow x 3.0)) (+ (/ 0.5 x) (/ 0.0625 (pow x 5.0)))))
(if (<= x 0.9609921084103406)
(+
(+ x (* (* 0.075 (pow (* (cbrt x) (cbrt x)) 5.0)) (pow (cbrt x) 5.0)))
(* (pow x 3.0) -0.16666666666666666))
(log (- (+ (/ 0.5 x) (+ x x)) (/ 0.125 (pow x 3.0)))))))double code(double x) {
return log(x + sqrt((x * x) + 1.0));
}
double code(double x) {
double tmp;
if (x <= -1.042983533250168) {
tmp = log((0.125 / pow(x, 3.0)) - ((0.5 / x) + (0.0625 / pow(x, 5.0))));
} else if (x <= 0.9609921084103406) {
tmp = (x + ((0.075 * pow((cbrt(x) * cbrt(x)), 5.0)) * pow(cbrt(x), 5.0))) + (pow(x, 3.0) * -0.16666666666666666);
} else {
tmp = log(((0.5 / x) + (x + x)) - (0.125 / pow(x, 3.0)));
}
return tmp;
}










Bits error versus x
Results
| Original | 53.0 |
|---|---|
| Target | 45.5 |
| Herbie | 0.2 |
| Alternative 1 | |
|---|---|
| Accuracy | 8.5 |
| Cost | 2947 |
| Alternative 2 | |
|---|---|
| Accuracy | 16.5 |
| Cost | 2690 |
| Alternative 3 | |
|---|---|
| Accuracy | 24.2 |
| Cost | 2049 |
| Alternative 4 | |
|---|---|
| Accuracy | 23.9 |
| Cost | 1601 |
| Alternative 5 | |
|---|---|
| Accuracy | 38.5 |
| Cost | 1668 |
| Alternative 6 | |
|---|---|
| Accuracy | 47.9 |
| Cost | 1344 |
if x < -1.042983533250168Initial program 63.1
Taylor expanded around -inf 0.1
Simplified0.1
if -1.042983533250168 < x < 0.96099210841034055Initial program 58.6
Taylor expanded around 0 0.2
Simplified0.2
rmApplied add-cube-cbrt_binary64_18180.2
Applied unpow-prod-down_binary64_18620.2
Applied associate-*r*_binary64_17230.2
rmApplied sub-neg_binary64_17760.2
Simplified0.2
if 0.96099210841034055 < x Initial program 31.8
Taylor expanded around inf 0.3
Simplified0.3
Final simplification0.2
herbie shell --seed 2020322
(FPCore (x)
:name "Hyperbolic arcsine"
:precision binary64
: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)))))