
(FPCore (a b) :precision binary64 :pre TRUE (- (* (* (* 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(Float64(Float64(a * a) * b) * b)) end
function tmp = code(a, b) tmp = -(((a * a) * b) * b); end
code[a_, b_] := (-N[(N[(N[(a * a), $MachinePrecision] * b), $MachinePrecision] * b), $MachinePrecision])
f(a, b): a in [-inf, +inf], b in [-inf, +inf] code: THEORY BEGIN f(a, b: real): real = - (((a * a) * b) * b) END code
-\left(\left(a \cdot a\right) \cdot b\right) \cdot b
Herbie found 3 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (a b) :precision binary64 :pre TRUE (- (* (* (* 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(Float64(Float64(a * a) * b) * b)) end
function tmp = code(a, b) tmp = -(((a * a) * b) * b); end
code[a_, b_] := (-N[(N[(N[(a * a), $MachinePrecision] * b), $MachinePrecision] * b), $MachinePrecision])
f(a, b): a in [-inf, +inf], b in [-inf, +inf] code: THEORY BEGIN f(a, b: real): real = - (((a * a) * b) * b) END code
-\left(\left(a \cdot a\right) \cdot b\right) \cdot b
(FPCore (a b) :precision binary64 :pre TRUE (* (- (* 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(-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]
f(a, b): a in [-inf, +inf], b in [-inf, +inf] code: THEORY BEGIN f(a, b: real): real = (- (a * b)) * (a * b) END code
\left(-a \cdot b\right) \cdot \left(a \cdot b\right)
Initial program 82.4%
Applied rewrites99.7%
(FPCore (a b)
:precision binary64
:pre TRUE
(let* ((t_0 (fmin (fabs a) (fabs b)))
(t_1 (fmax (fabs a) (fabs b)))
(t_2 (* t_0 t_1)))
(if (<= t_0 6.580653175437961e-184)
(* t_0 (* t_1 (- t_2)))
(- (* (* t_0 t_2) t_1)))))double code(double a, double b) {
double t_0 = fmin(fabs(a), fabs(b));
double t_1 = fmax(fabs(a), fabs(b));
double t_2 = t_0 * t_1;
double tmp;
if (t_0 <= 6.580653175437961e-184) {
tmp = t_0 * (t_1 * -t_2);
} else {
tmp = -((t_0 * t_2) * t_1);
}
return tmp;
}
real(8) function code(a, b)
use fmin_fmax_functions
real(8), intent (in) :: a
real(8), intent (in) :: b
real(8) :: t_0
real(8) :: t_1
real(8) :: t_2
real(8) :: tmp
t_0 = fmin(abs(a), abs(b))
t_1 = fmax(abs(a), abs(b))
t_2 = t_0 * t_1
if (t_0 <= 6.580653175437961d-184) then
tmp = t_0 * (t_1 * -t_2)
else
tmp = -((t_0 * t_2) * t_1)
end if
code = tmp
end function
public static double code(double a, double b) {
double t_0 = fmin(Math.abs(a), Math.abs(b));
double t_1 = fmax(Math.abs(a), Math.abs(b));
double t_2 = t_0 * t_1;
double tmp;
if (t_0 <= 6.580653175437961e-184) {
tmp = t_0 * (t_1 * -t_2);
} else {
tmp = -((t_0 * t_2) * t_1);
}
return tmp;
}
def code(a, b): t_0 = fmin(math.fabs(a), math.fabs(b)) t_1 = fmax(math.fabs(a), math.fabs(b)) t_2 = t_0 * t_1 tmp = 0 if t_0 <= 6.580653175437961e-184: tmp = t_0 * (t_1 * -t_2) else: tmp = -((t_0 * t_2) * t_1) return tmp
function code(a, b) t_0 = fmin(abs(a), abs(b)) t_1 = fmax(abs(a), abs(b)) t_2 = Float64(t_0 * t_1) tmp = 0.0 if (t_0 <= 6.580653175437961e-184) tmp = Float64(t_0 * Float64(t_1 * Float64(-t_2))); else tmp = Float64(-Float64(Float64(t_0 * t_2) * t_1)); end return tmp end
function tmp_2 = code(a, b) t_0 = min(abs(a), abs(b)); t_1 = max(abs(a), abs(b)); t_2 = t_0 * t_1; tmp = 0.0; if (t_0 <= 6.580653175437961e-184) tmp = t_0 * (t_1 * -t_2); else tmp = -((t_0 * t_2) * t_1); end tmp_2 = tmp; end
code[a_, b_] := Block[{t$95$0 = N[Min[N[Abs[a], $MachinePrecision], N[Abs[b], $MachinePrecision]], $MachinePrecision]}, Block[{t$95$1 = N[Max[N[Abs[a], $MachinePrecision], N[Abs[b], $MachinePrecision]], $MachinePrecision]}, Block[{t$95$2 = N[(t$95$0 * t$95$1), $MachinePrecision]}, If[LessEqual[t$95$0, 6.580653175437961e-184], N[(t$95$0 * N[(t$95$1 * (-t$95$2)), $MachinePrecision]), $MachinePrecision], (-N[(N[(t$95$0 * t$95$2), $MachinePrecision] * t$95$1), $MachinePrecision])]]]]
f(a, b): a in [-inf, +inf], b in [-inf, +inf] code: THEORY BEGIN f(a, b: real): real = LET tmp = IF ((abs(a)) < (abs(b))) THEN (abs(a)) ELSE (abs(b)) ENDIF IN LET t_0 = tmp IN LET tmp_1 = IF ((abs(a)) > (abs(b))) THEN (abs(a)) ELSE (abs(b)) ENDIF IN LET t_1 = tmp_1 IN LET t_2 = (t_0 * t_1) IN LET tmp_2 = IF (t_0 <= (6580653175437961130972315507035316039922052352214427415602883917303577306908167843261101333977352445741999890370571693156360685975903822368447221195269477525483941385406300821766125308814118449361006089885061212554973432008766510200778526960623710544485438428125839386444199040355138899994550125162709451305605458029968780076651215964718388915448941700891493845257793716167470693081408622299581374250924692848730125573753504285561761522928281298305819291272200644016265869140625e-661)) THEN (t_0 * (t_1 * (- t_2))) ELSE (- ((t_0 * t_2) * t_1)) ENDIF IN tmp_2 END code
\begin{array}{l}
t_0 := \mathsf{min}\left(\left|a\right|, \left|b\right|\right)\\
t_1 := \mathsf{max}\left(\left|a\right|, \left|b\right|\right)\\
t_2 := t\_0 \cdot t\_1\\
\mathbf{if}\;t\_0 \leq 6.580653175437961 \cdot 10^{-184}:\\
\;\;\;\;t\_0 \cdot \left(t\_1 \cdot \left(-t\_2\right)\right)\\
\mathbf{else}:\\
\;\;\;\;-\left(t\_0 \cdot t\_2\right) \cdot t\_1\\
\end{array}
if a < 6.5806531754379611e-184Initial program 82.4%
Applied rewrites81.9%
Applied rewrites94.3%
if 6.5806531754379611e-184 < a Initial program 82.4%
Applied rewrites93.9%
(FPCore (a b) :precision binary64 :pre TRUE (let* ((t_0 (fmin (fabs a) b)) (t_1 (fmax (fabs a) b))) (- (* (* t_0 (* t_0 t_1)) t_1))))
double code(double a, double b) {
double t_0 = fmin(fabs(a), b);
double t_1 = fmax(fabs(a), b);
return -((t_0 * (t_0 * t_1)) * t_1);
}
real(8) function code(a, b)
use fmin_fmax_functions
real(8), intent (in) :: a
real(8), intent (in) :: b
real(8) :: t_0
real(8) :: t_1
t_0 = fmin(abs(a), b)
t_1 = fmax(abs(a), b)
code = -((t_0 * (t_0 * t_1)) * t_1)
end function
public static double code(double a, double b) {
double t_0 = fmin(Math.abs(a), b);
double t_1 = fmax(Math.abs(a), b);
return -((t_0 * (t_0 * t_1)) * t_1);
}
def code(a, b): t_0 = fmin(math.fabs(a), b) t_1 = fmax(math.fabs(a), b) return -((t_0 * (t_0 * t_1)) * t_1)
function code(a, b) t_0 = fmin(abs(a), b) t_1 = fmax(abs(a), b) return Float64(-Float64(Float64(t_0 * Float64(t_0 * t_1)) * t_1)) end
function tmp = code(a, b) t_0 = min(abs(a), b); t_1 = max(abs(a), b); tmp = -((t_0 * (t_0 * t_1)) * t_1); end
code[a_, b_] := Block[{t$95$0 = N[Min[N[Abs[a], $MachinePrecision], b], $MachinePrecision]}, Block[{t$95$1 = N[Max[N[Abs[a], $MachinePrecision], b], $MachinePrecision]}, (-N[(N[(t$95$0 * N[(t$95$0 * t$95$1), $MachinePrecision]), $MachinePrecision] * t$95$1), $MachinePrecision])]]
f(a, b): a in [-inf, +inf], b in [-inf, +inf] code: THEORY BEGIN f(a, b: real): real = LET tmp = IF ((abs(a)) < b) THEN (abs(a)) ELSE b ENDIF IN LET t_0 = tmp IN LET tmp_1 = IF ((abs(a)) > b) THEN (abs(a)) ELSE b ENDIF IN LET t_1 = tmp_1 IN - ((t_0 * (t_0 * t_1)) * t_1) END code
\begin{array}{l}
t_0 := \mathsf{min}\left(\left|a\right|, b\right)\\
t_1 := \mathsf{max}\left(\left|a\right|, b\right)\\
-\left(t\_0 \cdot \left(t\_0 \cdot t\_1\right)\right) \cdot t\_1
\end{array}
Initial program 82.4%
Applied rewrites93.9%
herbie shell --seed 2026074 +o generate:egglog
(FPCore (a b)
:name "ab-angle->ABCF D"
:precision binary64
(- (* (* (* a a) b) b)))