| Alternative 1 | |
|---|---|
| Accuracy | 96.8% |
| Cost | 6784 |
\[\mathsf{fma}\left(x, x, y \cdot \left(-y\right)\right)
\]

(FPCore (x y) :precision binary64 (- (* x x) (* y y)))
(FPCore (x y) :precision binary64 (fma x x (* y (- y))))
double code(double x, double y) {
return (x * x) - (y * y);
}
double code(double x, double y) {
return fma(x, x, (y * -y));
}
function code(x, y) return Float64(Float64(x * x) - Float64(y * y)) end
function code(x, y) return fma(x, x, Float64(y * Float64(-y))) end
code[x_, y_] := N[(N[(x * x), $MachinePrecision] - N[(y * y), $MachinePrecision]), $MachinePrecision]
code[x_, y_] := N[(x * x + N[(y * (-y)), $MachinePrecision]), $MachinePrecision]
x \cdot x - y \cdot y
\mathsf{fma}\left(x, x, y \cdot \left(-y\right)\right)
Herbie found 4 alternatives:
| Alternative | Accuracy | Speedup |
|---|
Initial program 96.1%
Simplified98.0%
[Start]96.1% | \[ x \cdot x - y \cdot y
\] |
|---|---|
fma-neg [=>]98.0% | \[ \color{blue}{\mathsf{fma}\left(x, x, -y \cdot y\right)}
\] |
distribute-rgt-neg-in [=>]98.0% | \[ \mathsf{fma}\left(x, x, \color{blue}{y \cdot \left(-y\right)}\right)
\] |
Final simplification98.0%
| Alternative 1 | |
|---|---|
| Accuracy | 96.8% |
| Cost | 6784 |
| Alternative 2 | |
|---|---|
| Accuracy | 77.1% |
| Cost | 786 |
| Alternative 3 | |
|---|---|
| Accuracy | 96.6% |
| Cost | 708 |
| Alternative 4 | |
|---|---|
| Accuracy | 54.3% |
| Cost | 192 |
herbie shell --seed 2023258
(FPCore (x y)
:name "Examples.Basics.BasicTests:f2 from sbv-4.4"
:precision binary64
(- (* x x) (* y y)))