
(FPCore (a1 a2 b1 b2) :precision binary64 (/ (* a1 a2) (* b1 b2)))
double code(double a1, double a2, double b1, double b2) {
return (a1 * a2) / (b1 * b2);
}
real(8) function code(a1, a2, b1, b2)
real(8), intent (in) :: a1
real(8), intent (in) :: a2
real(8), intent (in) :: b1
real(8), intent (in) :: b2
code = (a1 * a2) / (b1 * b2)
end function
public static double code(double a1, double a2, double b1, double b2) {
return (a1 * a2) / (b1 * b2);
}
def code(a1, a2, b1, b2): return (a1 * a2) / (b1 * b2)
function code(a1, a2, b1, b2) return Float64(Float64(a1 * a2) / Float64(b1 * b2)) end
function tmp = code(a1, a2, b1, b2) tmp = (a1 * a2) / (b1 * b2); end
code[a1_, a2_, b1_, b2_] := N[(N[(a1 * a2), $MachinePrecision] / N[(b1 * b2), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{a1 \cdot a2}{b1 \cdot b2}
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 4 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (a1 a2 b1 b2) :precision binary64 (/ (* a1 a2) (* b1 b2)))
double code(double a1, double a2, double b1, double b2) {
return (a1 * a2) / (b1 * b2);
}
real(8) function code(a1, a2, b1, b2)
real(8), intent (in) :: a1
real(8), intent (in) :: a2
real(8), intent (in) :: b1
real(8), intent (in) :: b2
code = (a1 * a2) / (b1 * b2)
end function
public static double code(double a1, double a2, double b1, double b2) {
return (a1 * a2) / (b1 * b2);
}
def code(a1, a2, b1, b2): return (a1 * a2) / (b1 * b2)
function code(a1, a2, b1, b2) return Float64(Float64(a1 * a2) / Float64(b1 * b2)) end
function tmp = code(a1, a2, b1, b2) tmp = (a1 * a2) / (b1 * b2); end
code[a1_, a2_, b1_, b2_] := N[(N[(a1 * a2), $MachinePrecision] / N[(b1 * b2), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{a1 \cdot a2}{b1 \cdot b2}
\end{array}
(FPCore (a1 a2 b1 b2)
:precision binary64
(let* ((t_0 (/ (* a1 a2) (* b1 b2))))
(if (or (<= t_0 -2e-323) (and (not (<= t_0 1e-232)) (<= t_0 2e+298)))
t_0
(* (/ a1 b1) (/ a2 b2)))))
double code(double a1, double a2, double b1, double b2) {
double t_0 = (a1 * a2) / (b1 * b2);
double tmp;
if ((t_0 <= -2e-323) || (!(t_0 <= 1e-232) && (t_0 <= 2e+298))) {
tmp = t_0;
} else {
tmp = (a1 / b1) * (a2 / b2);
}
return tmp;
}
real(8) function code(a1, a2, b1, b2)
real(8), intent (in) :: a1
real(8), intent (in) :: a2
real(8), intent (in) :: b1
real(8), intent (in) :: b2
real(8) :: t_0
real(8) :: tmp
t_0 = (a1 * a2) / (b1 * b2)
if ((t_0 <= (-2d-323)) .or. (.not. (t_0 <= 1d-232)) .and. (t_0 <= 2d+298)) then
tmp = t_0
else
tmp = (a1 / b1) * (a2 / b2)
end if
code = tmp
end function
public static double code(double a1, double a2, double b1, double b2) {
double t_0 = (a1 * a2) / (b1 * b2);
double tmp;
if ((t_0 <= -2e-323) || (!(t_0 <= 1e-232) && (t_0 <= 2e+298))) {
tmp = t_0;
} else {
tmp = (a1 / b1) * (a2 / b2);
}
return tmp;
}
def code(a1, a2, b1, b2): t_0 = (a1 * a2) / (b1 * b2) tmp = 0 if (t_0 <= -2e-323) or (not (t_0 <= 1e-232) and (t_0 <= 2e+298)): tmp = t_0 else: tmp = (a1 / b1) * (a2 / b2) return tmp
function code(a1, a2, b1, b2) t_0 = Float64(Float64(a1 * a2) / Float64(b1 * b2)) tmp = 0.0 if ((t_0 <= -2e-323) || (!(t_0 <= 1e-232) && (t_0 <= 2e+298))) tmp = t_0; else tmp = Float64(Float64(a1 / b1) * Float64(a2 / b2)); end return tmp end
function tmp_2 = code(a1, a2, b1, b2) t_0 = (a1 * a2) / (b1 * b2); tmp = 0.0; if ((t_0 <= -2e-323) || (~((t_0 <= 1e-232)) && (t_0 <= 2e+298))) tmp = t_0; else tmp = (a1 / b1) * (a2 / b2); end tmp_2 = tmp; end
code[a1_, a2_, b1_, b2_] := Block[{t$95$0 = N[(N[(a1 * a2), $MachinePrecision] / N[(b1 * b2), $MachinePrecision]), $MachinePrecision]}, If[Or[LessEqual[t$95$0, -2e-323], And[N[Not[LessEqual[t$95$0, 1e-232]], $MachinePrecision], LessEqual[t$95$0, 2e+298]]], t$95$0, N[(N[(a1 / b1), $MachinePrecision] * N[(a2 / b2), $MachinePrecision]), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \frac{a1 \cdot a2}{b1 \cdot b2}\\
\mathbf{if}\;t_0 \leq -2 \cdot 10^{-323} \lor \neg \left(t_0 \leq 10^{-232}\right) \land t_0 \leq 2 \cdot 10^{+298}:\\
\;\;\;\;t_0\\
\mathbf{else}:\\
\;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\
\end{array}
\end{array}
if (/.f64 (*.f64 a1 a2) (*.f64 b1 b2)) < -1.97626e-323 or 1.00000000000000002e-232 < (/.f64 (*.f64 a1 a2) (*.f64 b1 b2)) < 1.9999999999999999e298Initial program 96.8%
if -1.97626e-323 < (/.f64 (*.f64 a1 a2) (*.f64 b1 b2)) < 1.00000000000000002e-232 or 1.9999999999999999e298 < (/.f64 (*.f64 a1 a2) (*.f64 b1 b2)) Initial program 78.8%
times-frac98.2%
Simplified98.2%
Final simplification97.4%
(FPCore (a1 a2 b1 b2) :precision binary64 (if (<= a1 5.2e+101) (* a1 (/ a2 (* b1 b2))) (* (/ a1 b1) (/ a2 b2))))
double code(double a1, double a2, double b1, double b2) {
double tmp;
if (a1 <= 5.2e+101) {
tmp = a1 * (a2 / (b1 * b2));
} else {
tmp = (a1 / b1) * (a2 / b2);
}
return tmp;
}
real(8) function code(a1, a2, b1, b2)
real(8), intent (in) :: a1
real(8), intent (in) :: a2
real(8), intent (in) :: b1
real(8), intent (in) :: b2
real(8) :: tmp
if (a1 <= 5.2d+101) then
tmp = a1 * (a2 / (b1 * b2))
else
tmp = (a1 / b1) * (a2 / b2)
end if
code = tmp
end function
public static double code(double a1, double a2, double b1, double b2) {
double tmp;
if (a1 <= 5.2e+101) {
tmp = a1 * (a2 / (b1 * b2));
} else {
tmp = (a1 / b1) * (a2 / b2);
}
return tmp;
}
def code(a1, a2, b1, b2): tmp = 0 if a1 <= 5.2e+101: tmp = a1 * (a2 / (b1 * b2)) else: tmp = (a1 / b1) * (a2 / b2) return tmp
function code(a1, a2, b1, b2) tmp = 0.0 if (a1 <= 5.2e+101) tmp = Float64(a1 * Float64(a2 / Float64(b1 * b2))); else tmp = Float64(Float64(a1 / b1) * Float64(a2 / b2)); end return tmp end
function tmp_2 = code(a1, a2, b1, b2) tmp = 0.0; if (a1 <= 5.2e+101) tmp = a1 * (a2 / (b1 * b2)); else tmp = (a1 / b1) * (a2 / b2); end tmp_2 = tmp; end
code[a1_, a2_, b1_, b2_] := If[LessEqual[a1, 5.2e+101], N[(a1 * N[(a2 / N[(b1 * b2), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(N[(a1 / b1), $MachinePrecision] * N[(a2 / b2), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;a1 \leq 5.2 \cdot 10^{+101}:\\
\;\;\;\;a1 \cdot \frac{a2}{b1 \cdot b2}\\
\mathbf{else}:\\
\;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\
\end{array}
\end{array}
if a1 < 5.2e101Initial program 90.4%
associate-/l*90.9%
*-commutative90.9%
associate-/l*90.5%
Simplified90.5%
clear-num89.7%
associate-/r/90.4%
clear-num91.2%
associate-/l/91.3%
*-commutative91.3%
Applied egg-rr91.3%
if 5.2e101 < a1 Initial program 81.4%
times-frac95.0%
Simplified95.0%
Final simplification91.9%
(FPCore (a1 a2 b1 b2) :precision binary64 (if (<= b1 -1.5e-60) (* a1 (/ a2 (* b1 b2))) (/ a2 (* b2 (/ b1 a1)))))
double code(double a1, double a2, double b1, double b2) {
double tmp;
if (b1 <= -1.5e-60) {
tmp = a1 * (a2 / (b1 * b2));
} else {
tmp = a2 / (b2 * (b1 / a1));
}
return tmp;
}
real(8) function code(a1, a2, b1, b2)
real(8), intent (in) :: a1
real(8), intent (in) :: a2
real(8), intent (in) :: b1
real(8), intent (in) :: b2
real(8) :: tmp
if (b1 <= (-1.5d-60)) then
tmp = a1 * (a2 / (b1 * b2))
else
tmp = a2 / (b2 * (b1 / a1))
end if
code = tmp
end function
public static double code(double a1, double a2, double b1, double b2) {
double tmp;
if (b1 <= -1.5e-60) {
tmp = a1 * (a2 / (b1 * b2));
} else {
tmp = a2 / (b2 * (b1 / a1));
}
return tmp;
}
def code(a1, a2, b1, b2): tmp = 0 if b1 <= -1.5e-60: tmp = a1 * (a2 / (b1 * b2)) else: tmp = a2 / (b2 * (b1 / a1)) return tmp
function code(a1, a2, b1, b2) tmp = 0.0 if (b1 <= -1.5e-60) tmp = Float64(a1 * Float64(a2 / Float64(b1 * b2))); else tmp = Float64(a2 / Float64(b2 * Float64(b1 / a1))); end return tmp end
function tmp_2 = code(a1, a2, b1, b2) tmp = 0.0; if (b1 <= -1.5e-60) tmp = a1 * (a2 / (b1 * b2)); else tmp = a2 / (b2 * (b1 / a1)); end tmp_2 = tmp; end
code[a1_, a2_, b1_, b2_] := If[LessEqual[b1, -1.5e-60], N[(a1 * N[(a2 / N[(b1 * b2), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(a2 / N[(b2 * N[(b1 / a1), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;b1 \leq -1.5 \cdot 10^{-60}:\\
\;\;\;\;a1 \cdot \frac{a2}{b1 \cdot b2}\\
\mathbf{else}:\\
\;\;\;\;\frac{a2}{b2 \cdot \frac{b1}{a1}}\\
\end{array}
\end{array}
if b1 < -1.50000000000000009e-60Initial program 91.0%
associate-/l*91.0%
*-commutative91.0%
associate-/l*90.3%
Simplified90.3%
clear-num89.2%
associate-/r/90.2%
clear-num92.4%
associate-/l/92.3%
*-commutative92.3%
Applied egg-rr92.3%
if -1.50000000000000009e-60 < b1 Initial program 88.0%
times-frac88.1%
Simplified88.1%
clear-num88.1%
frac-times92.6%
*-un-lft-identity92.6%
Applied egg-rr92.6%
Final simplification92.5%
(FPCore (a1 a2 b1 b2) :precision binary64 (* (/ a1 b1) (/ a2 b2)))
double code(double a1, double a2, double b1, double b2) {
return (a1 / b1) * (a2 / b2);
}
real(8) function code(a1, a2, b1, b2)
real(8), intent (in) :: a1
real(8), intent (in) :: a2
real(8), intent (in) :: b1
real(8), intent (in) :: b2
code = (a1 / b1) * (a2 / b2)
end function
public static double code(double a1, double a2, double b1, double b2) {
return (a1 / b1) * (a2 / b2);
}
def code(a1, a2, b1, b2): return (a1 / b1) * (a2 / b2)
function code(a1, a2, b1, b2) return Float64(Float64(a1 / b1) * Float64(a2 / b2)) end
function tmp = code(a1, a2, b1, b2) tmp = (a1 / b1) * (a2 / b2); end
code[a1_, a2_, b1_, b2_] := N[(N[(a1 / b1), $MachinePrecision] * N[(a2 / b2), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{a1}{b1} \cdot \frac{a2}{b2}
\end{array}
Initial program 88.9%
times-frac88.9%
Simplified88.9%
Final simplification88.9%
(FPCore (a1 a2 b1 b2) :precision binary64 (* (/ a1 b1) (/ a2 b2)))
double code(double a1, double a2, double b1, double b2) {
return (a1 / b1) * (a2 / b2);
}
real(8) function code(a1, a2, b1, b2)
real(8), intent (in) :: a1
real(8), intent (in) :: a2
real(8), intent (in) :: b1
real(8), intent (in) :: b2
code = (a1 / b1) * (a2 / b2)
end function
public static double code(double a1, double a2, double b1, double b2) {
return (a1 / b1) * (a2 / b2);
}
def code(a1, a2, b1, b2): return (a1 / b1) * (a2 / b2)
function code(a1, a2, b1, b2) return Float64(Float64(a1 / b1) * Float64(a2 / b2)) end
function tmp = code(a1, a2, b1, b2) tmp = (a1 / b1) * (a2 / b2); end
code[a1_, a2_, b1_, b2_] := N[(N[(a1 / b1), $MachinePrecision] * N[(a2 / b2), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{a1}{b1} \cdot \frac{a2}{b2}
\end{array}
herbie shell --seed 2023213
(FPCore (a1 a2 b1 b2)
:name "Quotient of products"
:precision binary64
:herbie-target
(* (/ a1 b1) (/ a2 b2))
(/ (* a1 a2) (* b1 b2)))