
(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)
use fmin_fmax_functions
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]
a \cdot a - b \cdot b
Herbie found 2 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)
use fmin_fmax_functions
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]
a \cdot a - b \cdot b
(FPCore (a b) :precision binary64 (* (- a b) (+ b a)))
double code(double a, double b) {
return (a - b) * (b + a);
}
real(8) function code(a, b)
use fmin_fmax_functions
real(8), intent (in) :: a
real(8), intent (in) :: b
code = (a - b) * (b + a)
end function
public static double code(double a, double b) {
return (a - b) * (b + a);
}
def code(a, b): return (a - b) * (b + a)
function code(a, b) return Float64(Float64(a - b) * Float64(b + a)) end
function tmp = code(a, b) tmp = (a - b) * (b + a); end
code[a_, b_] := N[(N[(a - b), $MachinePrecision] * N[(b + a), $MachinePrecision]), $MachinePrecision]
\left(a - b\right) \cdot \left(b + a\right)
Initial program 93.9%
lift--.f64N/A
lift-*.f64N/A
lift-*.f64N/A
difference-of-squaresN/A
*-commutativeN/A
lower-*.f64N/A
lower--.f64N/A
+-commutativeN/A
lower-+.f64100.0%
Applied rewrites100.0%
(FPCore (a b) :precision binary64 (* (- (fabs a) (fabs b)) (fabs b)))
double code(double a, double b) {
return (fabs(a) - fabs(b)) * fabs(b);
}
real(8) function code(a, b)
use fmin_fmax_functions
real(8), intent (in) :: a
real(8), intent (in) :: b
code = (abs(a) - abs(b)) * abs(b)
end function
public static double code(double a, double b) {
return (Math.abs(a) - Math.abs(b)) * Math.abs(b);
}
def code(a, b): return (math.fabs(a) - math.fabs(b)) * math.fabs(b)
function code(a, b) return Float64(Float64(abs(a) - abs(b)) * abs(b)) end
function tmp = code(a, b) tmp = (abs(a) - abs(b)) * abs(b); end
code[a_, b_] := N[(N[(N[Abs[a], $MachinePrecision] - N[Abs[b], $MachinePrecision]), $MachinePrecision] * N[Abs[b], $MachinePrecision]), $MachinePrecision]
\left(\left|a\right| - \left|b\right|\right) \cdot \left|b\right|
Initial program 93.9%
lift--.f64N/A
lift-*.f64N/A
lift-*.f64N/A
difference-of-squaresN/A
*-commutativeN/A
lower-*.f64N/A
lower--.f64N/A
+-commutativeN/A
lower-+.f64100.0%
Applied rewrites100.0%
Taylor expanded in a around 0
Applied rewrites56.8%
(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)
use fmin_fmax_functions
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]
\left(a + b\right) \cdot \left(a - b\right)
herbie shell --seed 2025323
(FPCore (a b)
:name "Difference of squares"
:precision binary64
:alt
(! :herbie-platform c (* (+ a b) (- a b)))
(- (* a a) (* b b)))