| Alternative 1 | |
|---|---|
| Accuracy | 90.5% |
| Cost | 452 |
\[\begin{array}{l}
\mathbf{if}\;z \leq 6.9 \cdot 10^{-116}:\\
\;\;\;\;y \cdot \frac{x}{z}\\
\mathbf{else}:\\
\;\;\;\;x \cdot \frac{y}{z}\\
\end{array}
\]
(FPCore (x y z) :precision binary64 (/ (* x y) z))
(FPCore (x y z)
:precision binary64
(if (or (<= (* x y) -1e+234)
(and (not (<= (* x y) -5e-101)) (<= (* x y) 2e-309)))
(* y (/ x z))
(/ (* x y) z)))double code(double x, double y, double z) {
return (x * y) / z;
}
double code(double x, double y, double z) {
double tmp;
if (((x * y) <= -1e+234) || (!((x * y) <= -5e-101) && ((x * y) <= 2e-309))) {
tmp = y * (x / z);
} else {
tmp = (x * y) / z;
}
return tmp;
}
real(8) function code(x, y, z)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
code = (x * y) / z
end function
real(8) function code(x, y, z)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
real(8) :: tmp
if (((x * y) <= (-1d+234)) .or. (.not. ((x * y) <= (-5d-101))) .and. ((x * y) <= 2d-309)) then
tmp = y * (x / z)
else
tmp = (x * y) / z
end if
code = tmp
end function
public static double code(double x, double y, double z) {
return (x * y) / z;
}
public static double code(double x, double y, double z) {
double tmp;
if (((x * y) <= -1e+234) || (!((x * y) <= -5e-101) && ((x * y) <= 2e-309))) {
tmp = y * (x / z);
} else {
tmp = (x * y) / z;
}
return tmp;
}
def code(x, y, z): return (x * y) / z
def code(x, y, z): tmp = 0 if ((x * y) <= -1e+234) or (not ((x * y) <= -5e-101) and ((x * y) <= 2e-309)): tmp = y * (x / z) else: tmp = (x * y) / z return tmp
function code(x, y, z) return Float64(Float64(x * y) / z) end
function code(x, y, z) tmp = 0.0 if ((Float64(x * y) <= -1e+234) || (!(Float64(x * y) <= -5e-101) && (Float64(x * y) <= 2e-309))) tmp = Float64(y * Float64(x / z)); else tmp = Float64(Float64(x * y) / z); end return tmp end
function tmp = code(x, y, z) tmp = (x * y) / z; end
function tmp_2 = code(x, y, z) tmp = 0.0; if (((x * y) <= -1e+234) || (~(((x * y) <= -5e-101)) && ((x * y) <= 2e-309))) tmp = y * (x / z); else tmp = (x * y) / z; end tmp_2 = tmp; end
code[x_, y_, z_] := N[(N[(x * y), $MachinePrecision] / z), $MachinePrecision]
code[x_, y_, z_] := If[Or[LessEqual[N[(x * y), $MachinePrecision], -1e+234], And[N[Not[LessEqual[N[(x * y), $MachinePrecision], -5e-101]], $MachinePrecision], LessEqual[N[(x * y), $MachinePrecision], 2e-309]]], N[(y * N[(x / z), $MachinePrecision]), $MachinePrecision], N[(N[(x * y), $MachinePrecision] / z), $MachinePrecision]]
\frac{x \cdot y}{z}
\begin{array}{l}
\mathbf{if}\;x \cdot y \leq -1 \cdot 10^{+234} \lor \neg \left(x \cdot y \leq -5 \cdot 10^{-101}\right) \land x \cdot y \leq 2 \cdot 10^{-309}:\\
\;\;\;\;y \cdot \frac{x}{z}\\
\mathbf{else}:\\
\;\;\;\;\frac{x \cdot y}{z}\\
\end{array}
Results
| Original | 90.5% |
|---|---|
| Target | 90.8% |
| Herbie | 96.3% |
if (*.f64 x y) < -1.00000000000000002e234 or -5.0000000000000001e-101 < (*.f64 x y) < 1.9999999999999988e-309Initial program 79.5%
Simplified97.2%
[Start]79.5 | \[ \frac{x \cdot y}{z}
\] |
|---|---|
associate-*l/ [<=]97.2 | \[ \color{blue}{\frac{x}{z} \cdot y}
\] |
if -1.00000000000000002e234 < (*.f64 x y) < -5.0000000000000001e-101 or 1.9999999999999988e-309 < (*.f64 x y) Initial program 95.9%
Final simplification96.3%
| Alternative 1 | |
|---|---|
| Accuracy | 90.5% |
| Cost | 452 |
| Alternative 2 | |
|---|---|
| Accuracy | 90.4% |
| Cost | 452 |
| Alternative 3 | |
|---|---|
| Accuracy | 90.9% |
| Cost | 320 |
herbie shell --seed 2023151
(FPCore (x y z)
:name "Diagrams.Solve.Tridiagonal:solveCyclicTriDiagonal from diagrams-solve-0.1, A"
:precision binary64
:herbie-target
(if (< z -4.262230790519429e-138) (/ (* x y) z) (if (< z 1.7042130660650472e-164) (/ x (/ z y)) (* (/ x z) y)))
(/ (* x y) z))