(FPCore (a1 a2 b1 b2) :precision binary64 (/ (* a1 a2) (* b1 b2)))
(FPCore (a1 a2 b1 b2)
:precision binary64
(let* ((t_0 (* (/ a2 b1) a1)) (t_1 (/ t_0 b2)))
(if (<= (* b1 b2) -1e+254)
t_1
(if (<= (* b1 b2) -5e-124)
(* a1 (/ a2 (* b1 b2)))
(if (<= (* b1 b2) 1e-95)
(* t_0 (/ 1.0 b2))
(if (<= (* b1 b2) 2e+140) (/ 1.0 (/ (* b1 b2) (* a2 a1))) t_1))))))double code(double a1, double a2, double b1, double b2) {
return (a1 * a2) / (b1 * b2);
}
double code(double a1, double a2, double b1, double b2) {
double t_0 = (a2 / b1) * a1;
double t_1 = t_0 / b2;
double tmp;
if ((b1 * b2) <= -1e+254) {
tmp = t_1;
} else if ((b1 * b2) <= -5e-124) {
tmp = a1 * (a2 / (b1 * b2));
} else if ((b1 * b2) <= 1e-95) {
tmp = t_0 * (1.0 / b2);
} else if ((b1 * b2) <= 2e+140) {
tmp = 1.0 / ((b1 * b2) / (a2 * a1));
} else {
tmp = t_1;
}
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
code = (a1 * a2) / (b1 * b2)
end function
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) :: t_1
real(8) :: tmp
t_0 = (a2 / b1) * a1
t_1 = t_0 / b2
if ((b1 * b2) <= (-1d+254)) then
tmp = t_1
else if ((b1 * b2) <= (-5d-124)) then
tmp = a1 * (a2 / (b1 * b2))
else if ((b1 * b2) <= 1d-95) then
tmp = t_0 * (1.0d0 / b2)
else if ((b1 * b2) <= 2d+140) then
tmp = 1.0d0 / ((b1 * b2) / (a2 * a1))
else
tmp = t_1
end if
code = tmp
end function
public static double code(double a1, double a2, double b1, double b2) {
return (a1 * a2) / (b1 * b2);
}
public static double code(double a1, double a2, double b1, double b2) {
double t_0 = (a2 / b1) * a1;
double t_1 = t_0 / b2;
double tmp;
if ((b1 * b2) <= -1e+254) {
tmp = t_1;
} else if ((b1 * b2) <= -5e-124) {
tmp = a1 * (a2 / (b1 * b2));
} else if ((b1 * b2) <= 1e-95) {
tmp = t_0 * (1.0 / b2);
} else if ((b1 * b2) <= 2e+140) {
tmp = 1.0 / ((b1 * b2) / (a2 * a1));
} else {
tmp = t_1;
}
return tmp;
}
def code(a1, a2, b1, b2): return (a1 * a2) / (b1 * b2)
def code(a1, a2, b1, b2): t_0 = (a2 / b1) * a1 t_1 = t_0 / b2 tmp = 0 if (b1 * b2) <= -1e+254: tmp = t_1 elif (b1 * b2) <= -5e-124: tmp = a1 * (a2 / (b1 * b2)) elif (b1 * b2) <= 1e-95: tmp = t_0 * (1.0 / b2) elif (b1 * b2) <= 2e+140: tmp = 1.0 / ((b1 * b2) / (a2 * a1)) else: tmp = t_1 return tmp
function code(a1, a2, b1, b2) return Float64(Float64(a1 * a2) / Float64(b1 * b2)) end
function code(a1, a2, b1, b2) t_0 = Float64(Float64(a2 / b1) * a1) t_1 = Float64(t_0 / b2) tmp = 0.0 if (Float64(b1 * b2) <= -1e+254) tmp = t_1; elseif (Float64(b1 * b2) <= -5e-124) tmp = Float64(a1 * Float64(a2 / Float64(b1 * b2))); elseif (Float64(b1 * b2) <= 1e-95) tmp = Float64(t_0 * Float64(1.0 / b2)); elseif (Float64(b1 * b2) <= 2e+140) tmp = Float64(1.0 / Float64(Float64(b1 * b2) / Float64(a2 * a1))); else tmp = t_1; end return tmp end
function tmp = code(a1, a2, b1, b2) tmp = (a1 * a2) / (b1 * b2); end
function tmp_2 = code(a1, a2, b1, b2) t_0 = (a2 / b1) * a1; t_1 = t_0 / b2; tmp = 0.0; if ((b1 * b2) <= -1e+254) tmp = t_1; elseif ((b1 * b2) <= -5e-124) tmp = a1 * (a2 / (b1 * b2)); elseif ((b1 * b2) <= 1e-95) tmp = t_0 * (1.0 / b2); elseif ((b1 * b2) <= 2e+140) tmp = 1.0 / ((b1 * b2) / (a2 * a1)); else tmp = t_1; end tmp_2 = tmp; end
code[a1_, a2_, b1_, b2_] := N[(N[(a1 * a2), $MachinePrecision] / N[(b1 * b2), $MachinePrecision]), $MachinePrecision]
code[a1_, a2_, b1_, b2_] := Block[{t$95$0 = N[(N[(a2 / b1), $MachinePrecision] * a1), $MachinePrecision]}, Block[{t$95$1 = N[(t$95$0 / b2), $MachinePrecision]}, If[LessEqual[N[(b1 * b2), $MachinePrecision], -1e+254], t$95$1, If[LessEqual[N[(b1 * b2), $MachinePrecision], -5e-124], N[(a1 * N[(a2 / N[(b1 * b2), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], If[LessEqual[N[(b1 * b2), $MachinePrecision], 1e-95], N[(t$95$0 * N[(1.0 / b2), $MachinePrecision]), $MachinePrecision], If[LessEqual[N[(b1 * b2), $MachinePrecision], 2e+140], N[(1.0 / N[(N[(b1 * b2), $MachinePrecision] / N[(a2 * a1), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], t$95$1]]]]]]
\frac{a1 \cdot a2}{b1 \cdot b2}
\begin{array}{l}
t_0 := \frac{a2}{b1} \cdot a1\\
t_1 := \frac{t_0}{b2}\\
\mathbf{if}\;b1 \cdot b2 \leq -1 \cdot 10^{+254}:\\
\;\;\;\;t_1\\
\mathbf{elif}\;b1 \cdot b2 \leq -5 \cdot 10^{-124}:\\
\;\;\;\;a1 \cdot \frac{a2}{b1 \cdot b2}\\
\mathbf{elif}\;b1 \cdot b2 \leq 10^{-95}:\\
\;\;\;\;t_0 \cdot \frac{1}{b2}\\
\mathbf{elif}\;b1 \cdot b2 \leq 2 \cdot 10^{+140}:\\
\;\;\;\;\frac{1}{\frac{b1 \cdot b2}{a2 \cdot a1}}\\
\mathbf{else}:\\
\;\;\;\;t_1\\
\end{array}
Results
| Original | 11.1 |
|---|---|
| Target | 11.4 |
| Herbie | 6.3 |
if (*.f64 b1 b2) < -9.9999999999999994e253 or 2.00000000000000012e140 < (*.f64 b1 b2) Initial program 16.0
Simplified15.3
Applied egg-rr5.6
if -9.9999999999999994e253 < (*.f64 b1 b2) < -5.0000000000000003e-124Initial program 4.4
Simplified4.3
if -5.0000000000000003e-124 < (*.f64 b1 b2) < 9.99999999999999989e-96Initial program 20.6
Simplified21.9
Applied egg-rr12.7
Applied egg-rr12.8
if 9.99999999999999989e-96 < (*.f64 b1 b2) < 2.00000000000000012e140Initial program 2.9
Simplified2.7
Applied egg-rr3.2
Final simplification6.3
herbie shell --seed 2022197
(FPCore (a1 a2 b1 b2)
:name "Quotient of products"
:precision binary64
:herbie-target
(* (/ a1 b1) (/ a2 b2))
(/ (* a1 a2) (* b1 b2)))