
(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 5 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 (if (<= (* a1 a2) 4e-235) (/ a2 (* (/ b1 a1) b2)) (if (<= (* a1 a2) 5e+128) (/ (* a1 a2) (* b1 b2)) (/ a1 (* b1 (/ b2 a2))))))
double code(double a1, double a2, double b1, double b2) {
double tmp;
if ((a1 * a2) <= 4e-235) {
tmp = a2 / ((b1 / a1) * b2);
} else if ((a1 * a2) <= 5e+128) {
tmp = (a1 * a2) / (b1 * b2);
} else {
tmp = a1 / (b1 * (b2 / a2));
}
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 * a2) <= 4d-235) then
tmp = a2 / ((b1 / a1) * b2)
else if ((a1 * a2) <= 5d+128) then
tmp = (a1 * a2) / (b1 * b2)
else
tmp = a1 / (b1 * (b2 / a2))
end if
code = tmp
end function
public static double code(double a1, double a2, double b1, double b2) {
double tmp;
if ((a1 * a2) <= 4e-235) {
tmp = a2 / ((b1 / a1) * b2);
} else if ((a1 * a2) <= 5e+128) {
tmp = (a1 * a2) / (b1 * b2);
} else {
tmp = a1 / (b1 * (b2 / a2));
}
return tmp;
}
def code(a1, a2, b1, b2): tmp = 0 if (a1 * a2) <= 4e-235: tmp = a2 / ((b1 / a1) * b2) elif (a1 * a2) <= 5e+128: tmp = (a1 * a2) / (b1 * b2) else: tmp = a1 / (b1 * (b2 / a2)) return tmp
function code(a1, a2, b1, b2) tmp = 0.0 if (Float64(a1 * a2) <= 4e-235) tmp = Float64(a2 / Float64(Float64(b1 / a1) * b2)); elseif (Float64(a1 * a2) <= 5e+128) tmp = Float64(Float64(a1 * a2) / Float64(b1 * b2)); else tmp = Float64(a1 / Float64(b1 * Float64(b2 / a2))); end return tmp end
function tmp_2 = code(a1, a2, b1, b2) tmp = 0.0; if ((a1 * a2) <= 4e-235) tmp = a2 / ((b1 / a1) * b2); elseif ((a1 * a2) <= 5e+128) tmp = (a1 * a2) / (b1 * b2); else tmp = a1 / (b1 * (b2 / a2)); end tmp_2 = tmp; end
code[a1_, a2_, b1_, b2_] := If[LessEqual[N[(a1 * a2), $MachinePrecision], 4e-235], N[(a2 / N[(N[(b1 / a1), $MachinePrecision] * b2), $MachinePrecision]), $MachinePrecision], If[LessEqual[N[(a1 * a2), $MachinePrecision], 5e+128], N[(N[(a1 * a2), $MachinePrecision] / N[(b1 * b2), $MachinePrecision]), $MachinePrecision], N[(a1 / N[(b1 * N[(b2 / a2), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;a1 \cdot a2 \leq 4 \cdot 10^{-235}:\\
\;\;\;\;\frac{a2}{\frac{b1}{a1} \cdot b2}\\
\mathbf{elif}\;a1 \cdot a2 \leq 5 \cdot 10^{+128}:\\
\;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\
\mathbf{else}:\\
\;\;\;\;\frac{a1}{b1 \cdot \frac{b2}{a2}}\\
\end{array}
\end{array}
if (*.f64 a1 a2) < 3.9999999999999998e-235Initial program 85.1%
times-frac90.4%
*-commutative90.4%
Simplified90.4%
*-commutative90.4%
clear-num90.4%
frac-times96.6%
*-un-lft-identity96.6%
Applied egg-rr96.6%
if 3.9999999999999998e-235 < (*.f64 a1 a2) < 5e128Initial program 95.5%
if 5e128 < (*.f64 a1 a2) Initial program 78.6%
times-frac91.4%
*-commutative91.4%
Simplified91.4%
clear-num91.5%
frac-times97.7%
*-un-lft-identity97.7%
Applied egg-rr97.7%
Final simplification96.5%
(FPCore (a1 a2 b1 b2) :precision binary64 (if (<= b1 1.55e-130) (/ a2 (/ (* b1 b2) a1)) (/ a1 (* b1 (/ b2 a2)))))
double code(double a1, double a2, double b1, double b2) {
double tmp;
if (b1 <= 1.55e-130) {
tmp = a2 / ((b1 * b2) / a1);
} else {
tmp = a1 / (b1 * (b2 / a2));
}
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.55d-130) then
tmp = a2 / ((b1 * b2) / a1)
else
tmp = a1 / (b1 * (b2 / a2))
end if
code = tmp
end function
public static double code(double a1, double a2, double b1, double b2) {
double tmp;
if (b1 <= 1.55e-130) {
tmp = a2 / ((b1 * b2) / a1);
} else {
tmp = a1 / (b1 * (b2 / a2));
}
return tmp;
}
def code(a1, a2, b1, b2): tmp = 0 if b1 <= 1.55e-130: tmp = a2 / ((b1 * b2) / a1) else: tmp = a1 / (b1 * (b2 / a2)) return tmp
function code(a1, a2, b1, b2) tmp = 0.0 if (b1 <= 1.55e-130) tmp = Float64(a2 / Float64(Float64(b1 * b2) / a1)); else tmp = Float64(a1 / Float64(b1 * Float64(b2 / a2))); end return tmp end
function tmp_2 = code(a1, a2, b1, b2) tmp = 0.0; if (b1 <= 1.55e-130) tmp = a2 / ((b1 * b2) / a1); else tmp = a1 / (b1 * (b2 / a2)); end tmp_2 = tmp; end
code[a1_, a2_, b1_, b2_] := If[LessEqual[b1, 1.55e-130], N[(a2 / N[(N[(b1 * b2), $MachinePrecision] / a1), $MachinePrecision]), $MachinePrecision], N[(a1 / N[(b1 * N[(b2 / a2), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;b1 \leq 1.55 \cdot 10^{-130}:\\
\;\;\;\;\frac{a2}{\frac{b1 \cdot b2}{a1}}\\
\mathbf{else}:\\
\;\;\;\;\frac{a1}{b1 \cdot \frac{b2}{a2}}\\
\end{array}
\end{array}
if b1 < 1.55000000000000005e-130Initial program 88.6%
times-frac87.6%
*-commutative87.6%
Simplified87.6%
frac-times88.6%
*-commutative88.6%
associate-/l*92.1%
*-commutative92.1%
Applied egg-rr92.1%
if 1.55000000000000005e-130 < b1 Initial program 82.3%
times-frac90.1%
*-commutative90.1%
Simplified90.1%
clear-num90.0%
frac-times93.2%
*-un-lft-identity93.2%
Applied egg-rr93.2%
Final simplification92.5%
(FPCore (a1 a2 b1 b2) :precision binary64 (* (/ a2 b2) (/ a1 b1)))
double code(double a1, double a2, double b1, double b2) {
return (a2 / b2) * (a1 / b1);
}
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 = (a2 / b2) * (a1 / b1)
end function
public static double code(double a1, double a2, double b1, double b2) {
return (a2 / b2) * (a1 / b1);
}
def code(a1, a2, b1, b2): return (a2 / b2) * (a1 / b1)
function code(a1, a2, b1, b2) return Float64(Float64(a2 / b2) * Float64(a1 / b1)) end
function tmp = code(a1, a2, b1, b2) tmp = (a2 / b2) * (a1 / b1); end
code[a1_, a2_, b1_, b2_] := N[(N[(a2 / b2), $MachinePrecision] * N[(a1 / b1), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{a2}{b2} \cdot \frac{a1}{b1}
\end{array}
Initial program 86.4%
times-frac88.5%
*-commutative88.5%
Simplified88.5%
Final simplification88.5%
(FPCore (a1 a2 b1 b2) :precision binary64 (/ a1 (* b1 (/ b2 a2))))
double code(double a1, double a2, double b1, double b2) {
return a1 / (b1 * (b2 / a2));
}
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 * (b2 / a2))
end function
public static double code(double a1, double a2, double b1, double b2) {
return a1 / (b1 * (b2 / a2));
}
def code(a1, a2, b1, b2): return a1 / (b1 * (b2 / a2))
function code(a1, a2, b1, b2) return Float64(a1 / Float64(b1 * Float64(b2 / a2))) end
function tmp = code(a1, a2, b1, b2) tmp = a1 / (b1 * (b2 / a2)); end
code[a1_, a2_, b1_, b2_] := N[(a1 / N[(b1 * N[(b2 / a2), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{a1}{b1 \cdot \frac{b2}{a2}}
\end{array}
Initial program 86.4%
times-frac88.5%
*-commutative88.5%
Simplified88.5%
clear-num88.2%
frac-times88.7%
*-un-lft-identity88.7%
Applied egg-rr88.7%
Final simplification88.7%
(FPCore (a1 a2 b1 b2) :precision binary64 (/ a2 (* (/ b1 a1) b2)))
double code(double a1, double a2, double b1, double b2) {
return a2 / ((b1 / a1) * 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 = a2 / ((b1 / a1) * b2)
end function
public static double code(double a1, double a2, double b1, double b2) {
return a2 / ((b1 / a1) * b2);
}
def code(a1, a2, b1, b2): return a2 / ((b1 / a1) * b2)
function code(a1, a2, b1, b2) return Float64(a2 / Float64(Float64(b1 / a1) * b2)) end
function tmp = code(a1, a2, b1, b2) tmp = a2 / ((b1 / a1) * b2); end
code[a1_, a2_, b1_, b2_] := N[(a2 / N[(N[(b1 / a1), $MachinePrecision] * b2), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{a2}{\frac{b1}{a1} \cdot b2}
\end{array}
Initial program 86.4%
times-frac88.5%
*-commutative88.5%
Simplified88.5%
*-commutative88.5%
clear-num88.2%
frac-times90.5%
*-un-lft-identity90.5%
Applied egg-rr90.5%
Final simplification90.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}
herbie shell --seed 2023293
(FPCore (a1 a2 b1 b2)
:name "Quotient of products"
:precision binary64
:herbie-target
(* (/ a1 b1) (/ a2 b2))
(/ (* a1 a2) (* b1 b2)))