
(FPCore (a b) :precision binary64 (- (* a a) (* b b)))
double code(double a, double b) {
return (a * a) - (b * b);
}
real(8) function code(a, b)
real(8), intent (in) :: a
real(8), intent (in) :: b
code = (a * a) - (b * b)
end function
public static double code(double a, double b) {
return (a * a) - (b * b);
}
def code(a, b): return (a * a) - (b * b)
function code(a, b) return Float64(Float64(a * a) - Float64(b * b)) end
function tmp = code(a, b) tmp = (a * a) - (b * b); end
code[a_, b_] := N[(N[(a * a), $MachinePrecision] - N[(b * b), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
a \cdot a - b \cdot b
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 3 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (a b) :precision binary64 (- (* a a) (* b b)))
double code(double a, double b) {
return (a * a) - (b * b);
}
real(8) function code(a, b)
real(8), intent (in) :: a
real(8), intent (in) :: b
code = (a * a) - (b * b)
end function
public static double code(double a, double b) {
return (a * a) - (b * b);
}
def code(a, b): return (a * a) - (b * b)
function code(a, b) return Float64(Float64(a * a) - Float64(b * b)) end
function tmp = code(a, b) tmp = (a * a) - (b * b); end
code[a_, b_] := N[(N[(a * a), $MachinePrecision] - N[(b * b), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
a \cdot a - b \cdot b
\end{array}
NOTE: a should be positive before calling this function NOTE: b should be positive before calling this function (FPCore (a b) :precision binary64 (- (* a a) (* b b)))
a = abs(a);
b = abs(b);
double code(double a, double b) {
return (a * a) - (b * b);
}
NOTE: a should be positive before calling this function
NOTE: b should be positive before calling this function
real(8) function code(a, b)
real(8), intent (in) :: a
real(8), intent (in) :: b
code = (a * a) - (b * b)
end function
a = Math.abs(a);
b = Math.abs(b);
public static double code(double a, double b) {
return (a * a) - (b * b);
}
a = abs(a) b = abs(b) def code(a, b): return (a * a) - (b * b)
a = abs(a) b = abs(b) function code(a, b) return Float64(Float64(a * a) - Float64(b * b)) end
a = abs(a) b = abs(b) function tmp = code(a, b) tmp = (a * a) - (b * b); end
NOTE: a should be positive before calling this function NOTE: b should be positive before calling this function code[a_, b_] := N[(N[(a * a), $MachinePrecision] - N[(b * b), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
a = |a|\\
b = |b|\\
\\
a \cdot a - b \cdot b
\end{array}
Initial program 96.5%
NOTE: a should be positive before calling this function NOTE: b should be positive before calling this function (FPCore (a b) :precision binary64 (fma a a (- (* b b))))
a = abs(a);
b = abs(b);
double code(double a, double b) {
return fma(a, a, -(b * b));
}
a = abs(a) b = abs(b) function code(a, b) return fma(a, a, Float64(-Float64(b * b))) end
NOTE: a should be positive before calling this function NOTE: b should be positive before calling this function code[a_, b_] := N[(a * a + (-N[(b * b), $MachinePrecision])), $MachinePrecision]
\begin{array}{l}
a = |a|\\
b = |b|\\
\\
\mathsf{fma}\left(a, a, -b \cdot b\right)
\end{array}
Initial program 97.7%
NOTE: a should be positive before calling this function NOTE: b should be positive before calling this function (FPCore (a b) :precision binary64 (fma a a (* b (- b))))
a = abs(a);
b = abs(b);
double code(double a, double b) {
return fma(a, a, (b * -b));
}
a = abs(a) b = abs(b) function code(a, b) return fma(a, a, Float64(b * Float64(-b))) end
NOTE: a should be positive before calling this function NOTE: b should be positive before calling this function code[a_, b_] := N[(a * a + N[(b * (-b)), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
a = |a|\\
b = |b|\\
\\
\mathsf{fma}\left(a, a, b \cdot \left(-b\right)\right)
\end{array}
Initial program 97.7%
(FPCore (a b) :precision binary64 (* (+ a b) (- a b)))
double code(double a, double b) {
return (a + b) * (a - b);
}
real(8) function code(a, b)
real(8), intent (in) :: a
real(8), intent (in) :: b
code = (a + b) * (a - b)
end function
public static double code(double a, double b) {
return (a + b) * (a - b);
}
def code(a, b): return (a + b) * (a - b)
function code(a, b) return Float64(Float64(a + b) * Float64(a - b)) end
function tmp = code(a, b) tmp = (a + b) * (a - b); end
code[a_, b_] := N[(N[(a + b), $MachinePrecision] * N[(a - b), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\left(a + b\right) \cdot \left(a - b\right)
\end{array}
herbie shell --seed 2023276
(FPCore (a b)
:name "Difference of squares"
:precision binary64
:herbie-target
(* (+ a b) (- a b))
(- (* a a) (* b b)))