| Alternative 1 | |
|---|---|
| Accuracy | 98.1% |
| Cost | 47748 |

(FPCore (a b) :precision binary64 (- (+ (pow (+ (* a a) (* b b)) 2.0) (* 4.0 (+ (* (* a a) (+ 1.0 a)) (* (* b b) (- 1.0 (* 3.0 a)))))) 1.0))
(FPCore (a b)
:precision binary64
(if (<=
(+
(pow (+ (* a a) (* b b)) 2.0)
(* 4.0 (+ (* (* a a) (+ a 1.0)) (* (* b b) (- 1.0 (* a 3.0))))))
INFINITY)
(+
(fma
4.0
(fma a (fma a a a) (* b (* b (fma a -3.0 1.0))))
(pow (hypot a b) 4.0))
-1.0)
(* (* a a) (* a (+ a 4.0)))))double code(double a, double b) {
return (pow(((a * a) + (b * b)), 2.0) + (4.0 * (((a * a) * (1.0 + a)) + ((b * b) * (1.0 - (3.0 * a)))))) - 1.0;
}
double code(double a, double b) {
double tmp;
if ((pow(((a * a) + (b * b)), 2.0) + (4.0 * (((a * a) * (a + 1.0)) + ((b * b) * (1.0 - (a * 3.0)))))) <= ((double) INFINITY)) {
tmp = fma(4.0, fma(a, fma(a, a, a), (b * (b * fma(a, -3.0, 1.0)))), pow(hypot(a, b), 4.0)) + -1.0;
} else {
tmp = (a * a) * (a * (a + 4.0));
}
return tmp;
}
function code(a, b) return Float64(Float64((Float64(Float64(a * a) + Float64(b * b)) ^ 2.0) + Float64(4.0 * Float64(Float64(Float64(a * a) * Float64(1.0 + a)) + Float64(Float64(b * b) * Float64(1.0 - Float64(3.0 * a)))))) - 1.0) end
function code(a, b) tmp = 0.0 if (Float64((Float64(Float64(a * a) + Float64(b * b)) ^ 2.0) + Float64(4.0 * Float64(Float64(Float64(a * a) * Float64(a + 1.0)) + Float64(Float64(b * b) * Float64(1.0 - Float64(a * 3.0)))))) <= Inf) tmp = Float64(fma(4.0, fma(a, fma(a, a, a), Float64(b * Float64(b * fma(a, -3.0, 1.0)))), (hypot(a, b) ^ 4.0)) + -1.0); else tmp = Float64(Float64(a * a) * Float64(a * Float64(a + 4.0))); end return tmp end
code[a_, b_] := N[(N[(N[Power[N[(N[(a * a), $MachinePrecision] + N[(b * b), $MachinePrecision]), $MachinePrecision], 2.0], $MachinePrecision] + N[(4.0 * N[(N[(N[(a * a), $MachinePrecision] * N[(1.0 + a), $MachinePrecision]), $MachinePrecision] + N[(N[(b * b), $MachinePrecision] * N[(1.0 - N[(3.0 * a), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] - 1.0), $MachinePrecision]
code[a_, b_] := If[LessEqual[N[(N[Power[N[(N[(a * a), $MachinePrecision] + N[(b * b), $MachinePrecision]), $MachinePrecision], 2.0], $MachinePrecision] + N[(4.0 * N[(N[(N[(a * a), $MachinePrecision] * N[(a + 1.0), $MachinePrecision]), $MachinePrecision] + N[(N[(b * b), $MachinePrecision] * N[(1.0 - N[(a * 3.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], Infinity], N[(N[(4.0 * N[(a * N[(a * a + a), $MachinePrecision] + N[(b * N[(b * N[(a * -3.0 + 1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + N[Power[N[Sqrt[a ^ 2 + b ^ 2], $MachinePrecision], 4.0], $MachinePrecision]), $MachinePrecision] + -1.0), $MachinePrecision], N[(N[(a * a), $MachinePrecision] * N[(a * N[(a + 4.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\left({\left(a \cdot a + b \cdot b\right)}^{2} + 4 \cdot \left(\left(a \cdot a\right) \cdot \left(1 + a\right) + \left(b \cdot b\right) \cdot \left(1 - 3 \cdot a\right)\right)\right) - 1
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;{\left(a \cdot a + b \cdot b\right)}^{2} + 4 \cdot \left(\left(a \cdot a\right) \cdot \left(a + 1\right) + \left(b \cdot b\right) \cdot \left(1 - a \cdot 3\right)\right) \leq \infty:\\
\;\;\;\;\mathsf{fma}\left(4, \mathsf{fma}\left(a, \mathsf{fma}\left(a, a, a\right), b \cdot \left(b \cdot \mathsf{fma}\left(a, -3, 1\right)\right)\right), {\left(\mathsf{hypot}\left(a, b\right)\right)}^{4}\right) + -1\\
\mathbf{else}:\\
\;\;\;\;\left(a \cdot a\right) \cdot \left(a \cdot \left(a + 4\right)\right)\\
\end{array}
\end{array}
Herbie found 10 alternatives:
| Alternative | Accuracy | Speedup |
|---|
if (+.f64 (pow.f64 (+.f64 (*.f64 a a) (*.f64 b b)) 2) (*.f64 4 (+.f64 (*.f64 (*.f64 a a) (+.f64 1 a)) (*.f64 (*.f64 b b) (-.f64 1 (*.f64 3 a)))))) < +inf.0Initial program 99.9%
Simplified100.0%
[Start]99.9% | \[ \left({\left(a \cdot a + b \cdot b\right)}^{2} + 4 \cdot \left(\left(a \cdot a\right) \cdot \left(1 + a\right) + \left(b \cdot b\right) \cdot \left(1 - 3 \cdot a\right)\right)\right) - 1
\] |
|---|---|
sub-neg [=>]99.9% | \[ \color{blue}{\left({\left(a \cdot a + b \cdot b\right)}^{2} + 4 \cdot \left(\left(a \cdot a\right) \cdot \left(1 + a\right) + \left(b \cdot b\right) \cdot \left(1 - 3 \cdot a\right)\right)\right) + \left(-1\right)}
\] |
if +inf.0 < (+.f64 (pow.f64 (+.f64 (*.f64 a a) (*.f64 b b)) 2) (*.f64 4 (+.f64 (*.f64 (*.f64 a a) (+.f64 1 a)) (*.f64 (*.f64 b b) (-.f64 1 (*.f64 3 a)))))) Initial program 0.0%
Simplified2.5%
[Start]0.0% | \[ \left({\left(a \cdot a + b \cdot b\right)}^{2} + 4 \cdot \left(\left(a \cdot a\right) \cdot \left(1 + a\right) + \left(b \cdot b\right) \cdot \left(1 - 3 \cdot a\right)\right)\right) - 1
\] |
|---|---|
associate--l+ [=>]0.0% | \[ \color{blue}{{\left(a \cdot a + b \cdot b\right)}^{2} + \left(4 \cdot \left(\left(a \cdot a\right) \cdot \left(1 + a\right) + \left(b \cdot b\right) \cdot \left(1 - 3 \cdot a\right)\right) - 1\right)}
\] |
fma-def [=>]0.0% | \[ {\color{blue}{\left(\mathsf{fma}\left(a, a, b \cdot b\right)\right)}}^{2} + \left(4 \cdot \left(\left(a \cdot a\right) \cdot \left(1 + a\right) + \left(b \cdot b\right) \cdot \left(1 - 3 \cdot a\right)\right) - 1\right)
\] |
Taylor expanded in b around 0 25.5%
Simplified25.5%
[Start]25.5% | \[ \left({a}^{4} + 4 \cdot \left({a}^{2} \cdot \left(1 + a\right)\right)\right) - 1
\] |
|---|---|
associate--l+ [=>]25.5% | \[ \color{blue}{{a}^{4} + \left(4 \cdot \left({a}^{2} \cdot \left(1 + a\right)\right) - 1\right)}
\] |
associate-*r* [=>]25.5% | \[ {a}^{4} + \left(\color{blue}{\left(4 \cdot {a}^{2}\right) \cdot \left(1 + a\right)} - 1\right)
\] |
unpow2 [=>]25.5% | \[ {a}^{4} + \left(\left(4 \cdot \color{blue}{\left(a \cdot a\right)}\right) \cdot \left(1 + a\right) - 1\right)
\] |
Taylor expanded in a around inf 25.5%
Simplified91.7%
[Start]25.5% | \[ 4 \cdot {a}^{3} + {a}^{4}
\] |
|---|---|
*-commutative [=>]25.5% | \[ \color{blue}{{a}^{3} \cdot 4} + {a}^{4}
\] |
metadata-eval [<=]25.5% | \[ {a}^{3} \cdot 4 + {a}^{\color{blue}{\left(3 + 1\right)}}
\] |
pow-plus [<=]25.5% | \[ {a}^{3} \cdot 4 + \color{blue}{{a}^{3} \cdot a}
\] |
distribute-lft-out [=>]91.7% | \[ \color{blue}{{a}^{3} \cdot \left(4 + a\right)}
\] |
Applied egg-rr92.9%
[Start]91.7% | \[ {a}^{3} \cdot \left(4 + a\right)
\] |
|---|---|
flip-+ [=>]91.7% | \[ {a}^{3} \cdot \color{blue}{\frac{4 \cdot 4 - a \cdot a}{4 - a}}
\] |
associate-*r/ [=>]92.9% | \[ \color{blue}{\frac{{a}^{3} \cdot \left(4 \cdot 4 - a \cdot a\right)}{4 - a}}
\] |
metadata-eval [=>]92.9% | \[ \frac{{a}^{3} \cdot \left(\color{blue}{16} - a \cdot a\right)}{4 - a}
\] |
Simplified91.7%
[Start]92.9% | \[ \frac{{a}^{3} \cdot \left(16 - a \cdot a\right)}{4 - a}
\] |
|---|---|
*-commutative [<=]92.9% | \[ \frac{\color{blue}{\left(16 - a \cdot a\right) \cdot {a}^{3}}}{4 - a}
\] |
associate-/l* [=>]91.7% | \[ \color{blue}{\frac{16 - a \cdot a}{\frac{4 - a}{{a}^{3}}}}
\] |
Applied egg-rr91.7%
[Start]91.7% | \[ \frac{16 - a \cdot a}{\frac{4 - a}{{a}^{3}}}
\] |
|---|---|
associate-/r/ [=>]91.7% | \[ \color{blue}{\frac{16 - a \cdot a}{4 - a} \cdot {a}^{3}}
\] |
metadata-eval [<=]91.7% | \[ \frac{\color{blue}{4 \cdot 4} - a \cdot a}{4 - a} \cdot {a}^{3}
\] |
flip-+ [<=]91.7% | \[ \color{blue}{\left(4 + a\right)} \cdot {a}^{3}
\] |
cube-mult [=>]91.7% | \[ \left(4 + a\right) \cdot \color{blue}{\left(a \cdot \left(a \cdot a\right)\right)}
\] |
associate-*r* [=>]91.7% | \[ \color{blue}{\left(\left(4 + a\right) \cdot a\right) \cdot \left(a \cdot a\right)}
\] |
+-commutative [=>]91.7% | \[ \left(\color{blue}{\left(a + 4\right)} \cdot a\right) \cdot \left(a \cdot a\right)
\] |
Final simplification97.4%
| Alternative 1 | |
|---|---|
| Accuracy | 98.1% |
| Cost | 47748 |
| Alternative 2 | |
|---|---|
| Accuracy | 98.0% |
| Cost | 16580 |
| Alternative 3 | |
|---|---|
| Accuracy | 93.2% |
| Cost | 7305 |
| Alternative 4 | |
|---|---|
| Accuracy | 93.2% |
| Cost | 7241 |
| Alternative 5 | |
|---|---|
| Accuracy | 82.1% |
| Cost | 6792 |
| Alternative 6 | |
|---|---|
| Accuracy | 68.7% |
| Cost | 1352 |
| Alternative 7 | |
|---|---|
| Accuracy | 68.7% |
| Cost | 841 |
| Alternative 8 | |
|---|---|
| Accuracy | 68.7% |
| Cost | 841 |
| Alternative 9 | |
|---|---|
| Accuracy | 51.4% |
| Cost | 448 |
| Alternative 10 | |
|---|---|
| Accuracy | 24.6% |
| Cost | 64 |
herbie shell --seed 2023167
(FPCore (a b)
:name "Bouland and Aaronson, Equation (25)"
:precision binary64
(- (+ (pow (+ (* a a) (* b b)) 2.0) (* 4.0 (+ (* (* a a) (+ 1.0 a)) (* (* b b) (- 1.0 (* 3.0 a)))))) 1.0))