| Alternative 1 | |
|---|---|
| Accuracy | 99.5% |
| Cost | 39528 |

(FPCore (x) :precision binary32 (copysign (log (+ (fabs x) (sqrt (+ (* x x) 1.0)))) x))
(FPCore (x)
:precision binary32
(let* ((t_0 (copysign (log (+ (fabs x) (sqrt (+ (* x x) 1.0)))) x)))
(if (<= t_0 -0.5)
(copysign (- (log (- (hypot 1.0 x) x))) x)
(if (<= t_0 0.20000000298023224)
(copysign
(+
(* -0.16666666666666666 (pow x 3.0))
(+ (* 0.075 (pow x 5.0)) (+ x (* -0.044642857142857144 (pow x 7.0)))))
x)
(copysign (log (+ (fabs x) (hypot 1.0 x))) x)))))float code(float x) {
return copysignf(logf((fabsf(x) + sqrtf(((x * x) + 1.0f)))), x);
}
float code(float x) {
float t_0 = copysignf(logf((fabsf(x) + sqrtf(((x * x) + 1.0f)))), x);
float tmp;
if (t_0 <= -0.5f) {
tmp = copysignf(-logf((hypotf(1.0f, x) - x)), x);
} else if (t_0 <= 0.20000000298023224f) {
tmp = copysignf(((-0.16666666666666666f * powf(x, 3.0f)) + ((0.075f * powf(x, 5.0f)) + (x + (-0.044642857142857144f * powf(x, 7.0f))))), x);
} else {
tmp = copysignf(logf((fabsf(x) + hypotf(1.0f, x))), x);
}
return tmp;
}
function code(x) return copysign(log(Float32(abs(x) + sqrt(Float32(Float32(x * x) + Float32(1.0))))), x) end
function code(x) t_0 = copysign(log(Float32(abs(x) + sqrt(Float32(Float32(x * x) + Float32(1.0))))), x) tmp = Float32(0.0) if (t_0 <= Float32(-0.5)) tmp = copysign(Float32(-log(Float32(hypot(Float32(1.0), x) - x))), x); elseif (t_0 <= Float32(0.20000000298023224)) tmp = copysign(Float32(Float32(Float32(-0.16666666666666666) * (x ^ Float32(3.0))) + Float32(Float32(Float32(0.075) * (x ^ Float32(5.0))) + Float32(x + Float32(Float32(-0.044642857142857144) * (x ^ Float32(7.0)))))), x); else tmp = copysign(log(Float32(abs(x) + hypot(Float32(1.0), x))), x); end return tmp end
function tmp = code(x) tmp = sign(x) * abs(log((abs(x) + sqrt(((x * x) + single(1.0)))))); end
function tmp_2 = code(x) t_0 = sign(x) * abs(log((abs(x) + sqrt(((x * x) + single(1.0)))))); tmp = single(0.0); if (t_0 <= single(-0.5)) tmp = sign(x) * abs(-log((hypot(single(1.0), x) - x))); elseif (t_0 <= single(0.20000000298023224)) tmp = sign(x) * abs(((single(-0.16666666666666666) * (x ^ single(3.0))) + ((single(0.075) * (x ^ single(5.0))) + (x + (single(-0.044642857142857144) * (x ^ single(7.0))))))); else tmp = sign(x) * abs(log((abs(x) + hypot(single(1.0), x)))); end tmp_2 = tmp; end
\mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{x \cdot x + 1}\right), x\right)
\begin{array}{l}
t_0 := \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{x \cdot x + 1}\right), x\right)\\
\mathbf{if}\;t_0 \leq -0.5:\\
\;\;\;\;\mathsf{copysign}\left(-\log \left(\mathsf{hypot}\left(1, x\right) - x\right), x\right)\\
\mathbf{elif}\;t_0 \leq 0.20000000298023224:\\
\;\;\;\;\mathsf{copysign}\left(-0.16666666666666666 \cdot {x}^{3} + \left(0.075 \cdot {x}^{5} + \left(x + -0.044642857142857144 \cdot {x}^{7}\right)\right), x\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{copysign}\left(\log \left(\left|x\right| + \mathsf{hypot}\left(1, x\right)\right), x\right)\\
\end{array}
Herbie found 14 alternatives:
| Alternative | Accuracy | Speedup |
|---|
| Original | 38.0% |
|---|---|
| Target | 99.5% |
| Herbie | 99.5% |
if (copysign.f32 (log.f32 (+.f32 (fabs.f32 x) (sqrt.f32 (+.f32 (*.f32 x x) 1)))) x) < -0.5Initial program 49.4%
Applied egg-rr4.5%
[Start]49.4% | \[ \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{x \cdot x + 1}\right), x\right)
\] |
|---|---|
+-commutative [=>]49.4% | \[ \mathsf{copysign}\left(\log \color{blue}{\left(\sqrt{x \cdot x + 1} + \left|x\right|\right)}, x\right)
\] |
add-sqr-sqrt [=>]-0.0% | \[ \mathsf{copysign}\left(\log \left(\sqrt{x \cdot x + 1} + \left|\color{blue}{\sqrt{x} \cdot \sqrt{x}}\right|\right), x\right)
\] |
fabs-sqr [=>]-0.0% | \[ \mathsf{copysign}\left(\log \left(\sqrt{x \cdot x + 1} + \color{blue}{\sqrt{x} \cdot \sqrt{x}}\right), x\right)
\] |
add-sqr-sqrt [<=]7.9% | \[ \mathsf{copysign}\left(\log \left(\sqrt{x \cdot x + 1} + \color{blue}{x}\right), x\right)
\] |
flip-+ [=>]4.4% | \[ \mathsf{copysign}\left(\log \color{blue}{\left(\frac{\sqrt{x \cdot x + 1} \cdot \sqrt{x \cdot x + 1} - x \cdot x}{\sqrt{x \cdot x + 1} - x}\right)}, x\right)
\] |
log-div [=>]4.4% | \[ \mathsf{copysign}\left(\color{blue}{\log \left(\sqrt{x \cdot x + 1} \cdot \sqrt{x \cdot x + 1} - x \cdot x\right) - \log \left(\sqrt{x \cdot x + 1} - x\right)}, x\right)
\] |
add-sqr-sqrt [<=]4.4% | \[ \mathsf{copysign}\left(\log \left(\color{blue}{\left(x \cdot x + 1\right)} - x \cdot x\right) - \log \left(\sqrt{x \cdot x + 1} - x\right), x\right)
\] |
fma-def [=>]4.5% | \[ \mathsf{copysign}\left(\log \left(\color{blue}{\mathsf{fma}\left(x, x, 1\right)} - x \cdot x\right) - \log \left(\sqrt{x \cdot x + 1} - x\right), x\right)
\] |
+-commutative [=>]4.5% | \[ \mathsf{copysign}\left(\log \left(\mathsf{fma}\left(x, x, 1\right) - x \cdot x\right) - \log \left(\sqrt{\color{blue}{1 + x \cdot x}} - x\right), x\right)
\] |
hypot-1-def [=>]4.5% | \[ \mathsf{copysign}\left(\log \left(\mathsf{fma}\left(x, x, 1\right) - x \cdot x\right) - \log \left(\color{blue}{\mathsf{hypot}\left(1, x\right)} - x\right), x\right)
\] |
Simplified100.0%
[Start]4.5% | \[ \mathsf{copysign}\left(\log \left(\mathsf{fma}\left(x, x, 1\right) - x \cdot x\right) - \log \left(\mathsf{hypot}\left(1, x\right) - x\right), x\right)
\] |
|---|---|
fma-udef [=>]4.4% | \[ \mathsf{copysign}\left(\log \left(\color{blue}{\left(x \cdot x + 1\right)} - x \cdot x\right) - \log \left(\mathsf{hypot}\left(1, x\right) - x\right), x\right)
\] |
+-commutative [<=]4.4% | \[ \mathsf{copysign}\left(\log \left(\color{blue}{\left(1 + x \cdot x\right)} - x \cdot x\right) - \log \left(\mathsf{hypot}\left(1, x\right) - x\right), x\right)
\] |
associate--l+ [=>]45.9% | \[ \mathsf{copysign}\left(\log \color{blue}{\left(1 + \left(x \cdot x - x \cdot x\right)\right)} - \log \left(\mathsf{hypot}\left(1, x\right) - x\right), x\right)
\] |
+-inverses [=>]100.0% | \[ \mathsf{copysign}\left(\log \left(1 + \color{blue}{0}\right) - \log \left(\mathsf{hypot}\left(1, x\right) - x\right), x\right)
\] |
metadata-eval [=>]100.0% | \[ \mathsf{copysign}\left(\log \color{blue}{1} - \log \left(\mathsf{hypot}\left(1, x\right) - x\right), x\right)
\] |
metadata-eval [=>]100.0% | \[ \mathsf{copysign}\left(\color{blue}{0} - \log \left(\mathsf{hypot}\left(1, x\right) - x\right), x\right)
\] |
neg-sub0 [<=]100.0% | \[ \mathsf{copysign}\left(\color{blue}{-\log \left(\mathsf{hypot}\left(1, x\right) - x\right)}, x\right)
\] |
if -0.5 < (copysign.f32 (log.f32 (+.f32 (fabs.f32 x) (sqrt.f32 (+.f32 (*.f32 x x) 1)))) x) < 0.200000003Initial program 19.4%
Applied egg-rr20.0%
[Start]19.4% | \[ \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{x \cdot x + 1}\right), x\right)
\] |
|---|---|
*-un-lft-identity [=>]19.4% | \[ \mathsf{copysign}\left(\log \color{blue}{\left(1 \cdot \left(\left|x\right| + \sqrt{x \cdot x + 1}\right)\right)}, x\right)
\] |
*-commutative [=>]19.4% | \[ \mathsf{copysign}\left(\log \color{blue}{\left(\left(\left|x\right| + \sqrt{x \cdot x + 1}\right) \cdot 1\right)}, x\right)
\] |
log-prod [=>]19.4% | \[ \mathsf{copysign}\left(\color{blue}{\log \left(\left|x\right| + \sqrt{x \cdot x + 1}\right) + \log 1}, x\right)
\] |
add-sqr-sqrt [=>]10.1% | \[ \mathsf{copysign}\left(\log \left(\left|\color{blue}{\sqrt{x} \cdot \sqrt{x}}\right| + \sqrt{x \cdot x + 1}\right) + \log 1, x\right)
\] |
fabs-sqr [=>]10.1% | \[ \mathsf{copysign}\left(\log \left(\color{blue}{\sqrt{x} \cdot \sqrt{x}} + \sqrt{x \cdot x + 1}\right) + \log 1, x\right)
\] |
add-sqr-sqrt [<=]20.0% | \[ \mathsf{copysign}\left(\log \left(\color{blue}{x} + \sqrt{x \cdot x + 1}\right) + \log 1, x\right)
\] |
+-commutative [=>]20.0% | \[ \mathsf{copysign}\left(\log \left(x + \sqrt{\color{blue}{1 + x \cdot x}}\right) + \log 1, x\right)
\] |
hypot-1-def [=>]20.0% | \[ \mathsf{copysign}\left(\log \left(x + \color{blue}{\mathsf{hypot}\left(1, x\right)}\right) + \log 1, x\right)
\] |
metadata-eval [=>]20.0% | \[ \mathsf{copysign}\left(\log \left(x + \mathsf{hypot}\left(1, x\right)\right) + \color{blue}{0}, x\right)
\] |
Simplified20.0%
[Start]20.0% | \[ \mathsf{copysign}\left(\log \left(x + \mathsf{hypot}\left(1, x\right)\right) + 0, x\right)
\] |
|---|---|
+-rgt-identity [=>]20.0% | \[ \mathsf{copysign}\left(\color{blue}{\log \left(x + \mathsf{hypot}\left(1, x\right)\right)}, x\right)
\] |
Taylor expanded in x around 0 100.0%
if 0.200000003 < (copysign.f32 (log.f32 (+.f32 (fabs.f32 x) (sqrt.f32 (+.f32 (*.f32 x x) 1)))) x) Initial program 45.9%
Simplified95.6%
[Start]45.9% | \[ \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{x \cdot x + 1}\right), x\right)
\] |
|---|---|
+-commutative [=>]45.9% | \[ \mathsf{copysign}\left(\log \left(\left|x\right| + \sqrt{\color{blue}{1 + x \cdot x}}\right), x\right)
\] |
hypot-1-def [=>]95.6% | \[ \mathsf{copysign}\left(\log \left(\left|x\right| + \color{blue}{\mathsf{hypot}\left(1, x\right)}\right), x\right)
\] |
Final simplification98.9%
| Alternative 1 | |
|---|---|
| Accuracy | 99.5% |
| Cost | 39528 |
| Alternative 2 | |
|---|---|
| Accuracy | 99.5% |
| Cost | 39144 |
| Alternative 3 | |
|---|---|
| Accuracy | 99.5% |
| Cost | 10120 |
| Alternative 4 | |
|---|---|
| Accuracy | 97.3% |
| Cost | 9896 |
| Alternative 5 | |
|---|---|
| Accuracy | 99.4% |
| Cost | 9896 |
| Alternative 6 | |
|---|---|
| Accuracy | 99.4% |
| Cost | 9896 |
| Alternative 7 | |
|---|---|
| Accuracy | 96.7% |
| Cost | 6760 |
| Alternative 8 | |
|---|---|
| Accuracy | 79.8% |
| Cost | 6664 |
| Alternative 9 | |
|---|---|
| Accuracy | 95.8% |
| Cost | 6664 |
| Alternative 10 | |
|---|---|
| Accuracy | 96.0% |
| Cost | 6664 |
| Alternative 11 | |
|---|---|
| Accuracy | 64.4% |
| Cost | 6532 |
| Alternative 12 | |
|---|---|
| Accuracy | 62.6% |
| Cost | 3400 |
| Alternative 13 | |
|---|---|
| Accuracy | 17.3% |
| Cost | 3264 |
| Alternative 14 | |
|---|---|
| Accuracy | 18.6% |
| Cost | 3264 |
herbie shell --seed 2023165
(FPCore (x)
:name "Rust f32::asinh"
:precision binary32
:herbie-target
(copysign (log1p (+ (fabs x) (/ (fabs x) (+ (hypot 1.0 (/ 1.0 (fabs x))) (/ 1.0 (fabs x)))))) x)
(copysign (log (+ (fabs x) (sqrt (+ (* x x) 1.0)))) x))