
(FPCore (d1 d2 d3) :precision binary64 (+ (+ (* d1 d2) (* (+ d3 5.0) d1)) (* d1 32.0)))
double code(double d1, double d2, double d3) {
return ((d1 * d2) + ((d3 + 5.0) * d1)) + (d1 * 32.0);
}
real(8) function code(d1, d2, d3)
real(8), intent (in) :: d1
real(8), intent (in) :: d2
real(8), intent (in) :: d3
code = ((d1 * d2) + ((d3 + 5.0d0) * d1)) + (d1 * 32.0d0)
end function
public static double code(double d1, double d2, double d3) {
return ((d1 * d2) + ((d3 + 5.0) * d1)) + (d1 * 32.0);
}
def code(d1, d2, d3): return ((d1 * d2) + ((d3 + 5.0) * d1)) + (d1 * 32.0)
function code(d1, d2, d3) return Float64(Float64(Float64(d1 * d2) + Float64(Float64(d3 + 5.0) * d1)) + Float64(d1 * 32.0)) end
function tmp = code(d1, d2, d3) tmp = ((d1 * d2) + ((d3 + 5.0) * d1)) + (d1 * 32.0); end
code[d1_, d2_, d3_] := N[(N[(N[(d1 * d2), $MachinePrecision] + N[(N[(d3 + 5.0), $MachinePrecision] * d1), $MachinePrecision]), $MachinePrecision] + N[(d1 * 32.0), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\left(d1 \cdot d2 + \left(d3 + 5\right) \cdot d1\right) + d1 \cdot 32
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 7 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (d1 d2 d3) :precision binary64 (+ (+ (* d1 d2) (* (+ d3 5.0) d1)) (* d1 32.0)))
double code(double d1, double d2, double d3) {
return ((d1 * d2) + ((d3 + 5.0) * d1)) + (d1 * 32.0);
}
real(8) function code(d1, d2, d3)
real(8), intent (in) :: d1
real(8), intent (in) :: d2
real(8), intent (in) :: d3
code = ((d1 * d2) + ((d3 + 5.0d0) * d1)) + (d1 * 32.0d0)
end function
public static double code(double d1, double d2, double d3) {
return ((d1 * d2) + ((d3 + 5.0) * d1)) + (d1 * 32.0);
}
def code(d1, d2, d3): return ((d1 * d2) + ((d3 + 5.0) * d1)) + (d1 * 32.0)
function code(d1, d2, d3) return Float64(Float64(Float64(d1 * d2) + Float64(Float64(d3 + 5.0) * d1)) + Float64(d1 * 32.0)) end
function tmp = code(d1, d2, d3) tmp = ((d1 * d2) + ((d3 + 5.0) * d1)) + (d1 * 32.0); end
code[d1_, d2_, d3_] := N[(N[(N[(d1 * d2), $MachinePrecision] + N[(N[(d3 + 5.0), $MachinePrecision] * d1), $MachinePrecision]), $MachinePrecision] + N[(d1 * 32.0), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\left(d1 \cdot d2 + \left(d3 + 5\right) \cdot d1\right) + d1 \cdot 32
\end{array}
NOTE: d1, d2, and d3 should be sorted in increasing order before calling this function. (FPCore (d1 d2 d3) :precision binary64 (* d1 (+ d2 (+ d3 37.0))))
assert(d1 < d2 && d2 < d3);
double code(double d1, double d2, double d3) {
return d1 * (d2 + (d3 + 37.0));
}
NOTE: d1, d2, and d3 should be sorted in increasing order before calling this function.
real(8) function code(d1, d2, d3)
real(8), intent (in) :: d1
real(8), intent (in) :: d2
real(8), intent (in) :: d3
code = d1 * (d2 + (d3 + 37.0d0))
end function
assert d1 < d2 && d2 < d3;
public static double code(double d1, double d2, double d3) {
return d1 * (d2 + (d3 + 37.0));
}
[d1, d2, d3] = sort([d1, d2, d3]) def code(d1, d2, d3): return d1 * (d2 + (d3 + 37.0))
d1, d2, d3 = sort([d1, d2, d3]) function code(d1, d2, d3) return Float64(d1 * Float64(d2 + Float64(d3 + 37.0))) end
d1, d2, d3 = num2cell(sort([d1, d2, d3])){:}
function tmp = code(d1, d2, d3)
tmp = d1 * (d2 + (d3 + 37.0));
end
NOTE: d1, d2, and d3 should be sorted in increasing order before calling this function. code[d1_, d2_, d3_] := N[(d1 * N[(d2 + N[(d3 + 37.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
[d1, d2, d3] = \mathsf{sort}([d1, d2, d3])\\
\\
d1 \cdot \left(d2 + \left(d3 + 37\right)\right)
\end{array}
Initial program 98.8%
associate-+l+N/A
+-commutativeN/A
*-commutativeN/A
distribute-lft-outN/A
distribute-lft-outN/A
*-lowering-*.f64N/A
+-lowering-+.f64N/A
associate-+l+N/A
+-lowering-+.f64N/A
metadata-eval100.0
Applied egg-rr100.0%
Final simplification100.0%
NOTE: d1, d2, and d3 should be sorted in increasing order before calling this function. (FPCore (d1 d2 d3) :precision binary64 (let* ((t_0 (+ (+ (* d1 d2) (* d1 (+ d3 5.0))) (* d1 32.0)))) (if (<= t_0 -2e-241) (* d1 d2) (if (<= t_0 1e-35) (* d1 37.0) (* d1 d3)))))
assert(d1 < d2 && d2 < d3);
double code(double d1, double d2, double d3) {
double t_0 = ((d1 * d2) + (d1 * (d3 + 5.0))) + (d1 * 32.0);
double tmp;
if (t_0 <= -2e-241) {
tmp = d1 * d2;
} else if (t_0 <= 1e-35) {
tmp = d1 * 37.0;
} else {
tmp = d1 * d3;
}
return tmp;
}
NOTE: d1, d2, and d3 should be sorted in increasing order before calling this function.
real(8) function code(d1, d2, d3)
real(8), intent (in) :: d1
real(8), intent (in) :: d2
real(8), intent (in) :: d3
real(8) :: t_0
real(8) :: tmp
t_0 = ((d1 * d2) + (d1 * (d3 + 5.0d0))) + (d1 * 32.0d0)
if (t_0 <= (-2d-241)) then
tmp = d1 * d2
else if (t_0 <= 1d-35) then
tmp = d1 * 37.0d0
else
tmp = d1 * d3
end if
code = tmp
end function
assert d1 < d2 && d2 < d3;
public static double code(double d1, double d2, double d3) {
double t_0 = ((d1 * d2) + (d1 * (d3 + 5.0))) + (d1 * 32.0);
double tmp;
if (t_0 <= -2e-241) {
tmp = d1 * d2;
} else if (t_0 <= 1e-35) {
tmp = d1 * 37.0;
} else {
tmp = d1 * d3;
}
return tmp;
}
[d1, d2, d3] = sort([d1, d2, d3]) def code(d1, d2, d3): t_0 = ((d1 * d2) + (d1 * (d3 + 5.0))) + (d1 * 32.0) tmp = 0 if t_0 <= -2e-241: tmp = d1 * d2 elif t_0 <= 1e-35: tmp = d1 * 37.0 else: tmp = d1 * d3 return tmp
d1, d2, d3 = sort([d1, d2, d3]) function code(d1, d2, d3) t_0 = Float64(Float64(Float64(d1 * d2) + Float64(d1 * Float64(d3 + 5.0))) + Float64(d1 * 32.0)) tmp = 0.0 if (t_0 <= -2e-241) tmp = Float64(d1 * d2); elseif (t_0 <= 1e-35) tmp = Float64(d1 * 37.0); else tmp = Float64(d1 * d3); end return tmp end
d1, d2, d3 = num2cell(sort([d1, d2, d3])){:}
function tmp_2 = code(d1, d2, d3)
t_0 = ((d1 * d2) + (d1 * (d3 + 5.0))) + (d1 * 32.0);
tmp = 0.0;
if (t_0 <= -2e-241)
tmp = d1 * d2;
elseif (t_0 <= 1e-35)
tmp = d1 * 37.0;
else
tmp = d1 * d3;
end
tmp_2 = tmp;
end
NOTE: d1, d2, and d3 should be sorted in increasing order before calling this function.
code[d1_, d2_, d3_] := Block[{t$95$0 = N[(N[(N[(d1 * d2), $MachinePrecision] + N[(d1 * N[(d3 + 5.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + N[(d1 * 32.0), $MachinePrecision]), $MachinePrecision]}, If[LessEqual[t$95$0, -2e-241], N[(d1 * d2), $MachinePrecision], If[LessEqual[t$95$0, 1e-35], N[(d1 * 37.0), $MachinePrecision], N[(d1 * d3), $MachinePrecision]]]]
\begin{array}{l}
[d1, d2, d3] = \mathsf{sort}([d1, d2, d3])\\
\\
\begin{array}{l}
t_0 := \left(d1 \cdot d2 + d1 \cdot \left(d3 + 5\right)\right) + d1 \cdot 32\\
\mathbf{if}\;t\_0 \leq -2 \cdot 10^{-241}:\\
\;\;\;\;d1 \cdot d2\\
\mathbf{elif}\;t\_0 \leq 10^{-35}:\\
\;\;\;\;d1 \cdot 37\\
\mathbf{else}:\\
\;\;\;\;d1 \cdot d3\\
\end{array}
\end{array}
if (+.f64 (+.f64 (*.f64 d1 d2) (*.f64 (+.f64 d3 #s(literal 5 binary64)) d1)) (*.f64 d1 #s(literal 32 binary64))) < -1.9999999999999999e-241Initial program 99.9%
Taylor expanded in d2 around inf
+-rgt-identityN/A
accelerator-lowering-fma.f6440.1
Simplified40.1%
+-rgt-identityN/A
*-commutativeN/A
*-lowering-*.f6440.1
Applied egg-rr40.1%
if -1.9999999999999999e-241 < (+.f64 (+.f64 (*.f64 d1 d2) (*.f64 (+.f64 d3 #s(literal 5 binary64)) d1)) (*.f64 d1 #s(literal 32 binary64))) < 1.00000000000000001e-35Initial program 99.9%
Taylor expanded in d3 around 0
+-rgt-identityN/A
*-commutativeN/A
+-commutativeN/A
*-commutativeN/A
distribute-lft-outN/A
distribute-lft-outN/A
accelerator-lowering-fma.f64N/A
+-commutativeN/A
associate-+r+N/A
metadata-evalN/A
+-lowering-+.f6481.9
Simplified81.9%
Taylor expanded in d2 around 0
*-lowering-*.f6460.0
Simplified60.0%
if 1.00000000000000001e-35 < (+.f64 (+.f64 (*.f64 d1 d2) (*.f64 (+.f64 d3 #s(literal 5 binary64)) d1)) (*.f64 d1 #s(literal 32 binary64))) Initial program 97.2%
associate-+l+N/A
+-commutativeN/A
*-commutativeN/A
distribute-lft-outN/A
distribute-lft-outN/A
*-lowering-*.f64N/A
+-lowering-+.f64N/A
associate-+l+N/A
+-lowering-+.f64N/A
metadata-eval100.0
Applied egg-rr100.0%
Taylor expanded in d3 around inf
*-commutativeN/A
*-lowering-*.f6446.9
Simplified46.9%
Final simplification44.6%
NOTE: d1, d2, and d3 should be sorted in increasing order before calling this function. (FPCore (d1 d2 d3) :precision binary64 (if (<= (+ (+ (* d1 d2) (* d1 (+ d3 5.0))) (* d1 32.0)) 2e-286) (* d1 (+ 37.0 d2)) (* d1 (+ d3 37.0))))
assert(d1 < d2 && d2 < d3);
double code(double d1, double d2, double d3) {
double tmp;
if ((((d1 * d2) + (d1 * (d3 + 5.0))) + (d1 * 32.0)) <= 2e-286) {
tmp = d1 * (37.0 + d2);
} else {
tmp = d1 * (d3 + 37.0);
}
return tmp;
}
NOTE: d1, d2, and d3 should be sorted in increasing order before calling this function.
real(8) function code(d1, d2, d3)
real(8), intent (in) :: d1
real(8), intent (in) :: d2
real(8), intent (in) :: d3
real(8) :: tmp
if ((((d1 * d2) + (d1 * (d3 + 5.0d0))) + (d1 * 32.0d0)) <= 2d-286) then
tmp = d1 * (37.0d0 + d2)
else
tmp = d1 * (d3 + 37.0d0)
end if
code = tmp
end function
assert d1 < d2 && d2 < d3;
public static double code(double d1, double d2, double d3) {
double tmp;
if ((((d1 * d2) + (d1 * (d3 + 5.0))) + (d1 * 32.0)) <= 2e-286) {
tmp = d1 * (37.0 + d2);
} else {
tmp = d1 * (d3 + 37.0);
}
return tmp;
}
[d1, d2, d3] = sort([d1, d2, d3]) def code(d1, d2, d3): tmp = 0 if (((d1 * d2) + (d1 * (d3 + 5.0))) + (d1 * 32.0)) <= 2e-286: tmp = d1 * (37.0 + d2) else: tmp = d1 * (d3 + 37.0) return tmp
d1, d2, d3 = sort([d1, d2, d3]) function code(d1, d2, d3) tmp = 0.0 if (Float64(Float64(Float64(d1 * d2) + Float64(d1 * Float64(d3 + 5.0))) + Float64(d1 * 32.0)) <= 2e-286) tmp = Float64(d1 * Float64(37.0 + d2)); else tmp = Float64(d1 * Float64(d3 + 37.0)); end return tmp end
d1, d2, d3 = num2cell(sort([d1, d2, d3])){:}
function tmp_2 = code(d1, d2, d3)
tmp = 0.0;
if ((((d1 * d2) + (d1 * (d3 + 5.0))) + (d1 * 32.0)) <= 2e-286)
tmp = d1 * (37.0 + d2);
else
tmp = d1 * (d3 + 37.0);
end
tmp_2 = tmp;
end
NOTE: d1, d2, and d3 should be sorted in increasing order before calling this function. code[d1_, d2_, d3_] := If[LessEqual[N[(N[(N[(d1 * d2), $MachinePrecision] + N[(d1 * N[(d3 + 5.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + N[(d1 * 32.0), $MachinePrecision]), $MachinePrecision], 2e-286], N[(d1 * N[(37.0 + d2), $MachinePrecision]), $MachinePrecision], N[(d1 * N[(d3 + 37.0), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
[d1, d2, d3] = \mathsf{sort}([d1, d2, d3])\\
\\
\begin{array}{l}
\mathbf{if}\;\left(d1 \cdot d2 + d1 \cdot \left(d3 + 5\right)\right) + d1 \cdot 32 \leq 2 \cdot 10^{-286}:\\
\;\;\;\;d1 \cdot \left(37 + d2\right)\\
\mathbf{else}:\\
\;\;\;\;d1 \cdot \left(d3 + 37\right)\\
\end{array}
\end{array}
if (+.f64 (+.f64 (*.f64 d1 d2) (*.f64 (+.f64 d3 #s(literal 5 binary64)) d1)) (*.f64 d1 #s(literal 32 binary64))) < 2.0000000000000001e-286Initial program 99.9%
Taylor expanded in d3 around 0
+-rgt-identityN/A
*-commutativeN/A
+-commutativeN/A
*-commutativeN/A
distribute-lft-outN/A
distribute-lft-outN/A
accelerator-lowering-fma.f64N/A
+-commutativeN/A
associate-+r+N/A
metadata-evalN/A
+-lowering-+.f6470.3
Simplified70.3%
+-rgt-identityN/A
*-commutativeN/A
*-lowering-*.f64N/A
+-lowering-+.f6470.3
Applied egg-rr70.3%
if 2.0000000000000001e-286 < (+.f64 (+.f64 (*.f64 d1 d2) (*.f64 (+.f64 d3 #s(literal 5 binary64)) d1)) (*.f64 d1 #s(literal 32 binary64))) Initial program 97.6%
associate-+l+N/A
+-commutativeN/A
*-commutativeN/A
distribute-lft-outN/A
distribute-lft-outN/A
*-lowering-*.f64N/A
+-lowering-+.f64N/A
associate-+l+N/A
+-lowering-+.f64N/A
metadata-eval100.0
Applied egg-rr100.0%
Taylor expanded in d2 around 0
*-commutativeN/A
*-lowering-*.f64N/A
+-lowering-+.f6464.1
Simplified64.1%
Final simplification67.3%
NOTE: d1, d2, and d3 should be sorted in increasing order before calling this function. (FPCore (d1 d2 d3) :precision binary64 (let* ((t_0 (* d1 (+ d3 d2)))) (if (<= d2 -4.5e-12) t_0 (if (<= d2 1.45e-257) (* d1 37.0) t_0))))
assert(d1 < d2 && d2 < d3);
double code(double d1, double d2, double d3) {
double t_0 = d1 * (d3 + d2);
double tmp;
if (d2 <= -4.5e-12) {
tmp = t_0;
} else if (d2 <= 1.45e-257) {
tmp = d1 * 37.0;
} else {
tmp = t_0;
}
return tmp;
}
NOTE: d1, d2, and d3 should be sorted in increasing order before calling this function.
real(8) function code(d1, d2, d3)
real(8), intent (in) :: d1
real(8), intent (in) :: d2
real(8), intent (in) :: d3
real(8) :: t_0
real(8) :: tmp
t_0 = d1 * (d3 + d2)
if (d2 <= (-4.5d-12)) then
tmp = t_0
else if (d2 <= 1.45d-257) then
tmp = d1 * 37.0d0
else
tmp = t_0
end if
code = tmp
end function
assert d1 < d2 && d2 < d3;
public static double code(double d1, double d2, double d3) {
double t_0 = d1 * (d3 + d2);
double tmp;
if (d2 <= -4.5e-12) {
tmp = t_0;
} else if (d2 <= 1.45e-257) {
tmp = d1 * 37.0;
} else {
tmp = t_0;
}
return tmp;
}
[d1, d2, d3] = sort([d1, d2, d3]) def code(d1, d2, d3): t_0 = d1 * (d3 + d2) tmp = 0 if d2 <= -4.5e-12: tmp = t_0 elif d2 <= 1.45e-257: tmp = d1 * 37.0 else: tmp = t_0 return tmp
d1, d2, d3 = sort([d1, d2, d3]) function code(d1, d2, d3) t_0 = Float64(d1 * Float64(d3 + d2)) tmp = 0.0 if (d2 <= -4.5e-12) tmp = t_0; elseif (d2 <= 1.45e-257) tmp = Float64(d1 * 37.0); else tmp = t_0; end return tmp end
d1, d2, d3 = num2cell(sort([d1, d2, d3])){:}
function tmp_2 = code(d1, d2, d3)
t_0 = d1 * (d3 + d2);
tmp = 0.0;
if (d2 <= -4.5e-12)
tmp = t_0;
elseif (d2 <= 1.45e-257)
tmp = d1 * 37.0;
else
tmp = t_0;
end
tmp_2 = tmp;
end
NOTE: d1, d2, and d3 should be sorted in increasing order before calling this function.
code[d1_, d2_, d3_] := Block[{t$95$0 = N[(d1 * N[(d3 + d2), $MachinePrecision]), $MachinePrecision]}, If[LessEqual[d2, -4.5e-12], t$95$0, If[LessEqual[d2, 1.45e-257], N[(d1 * 37.0), $MachinePrecision], t$95$0]]]
\begin{array}{l}
[d1, d2, d3] = \mathsf{sort}([d1, d2, d3])\\
\\
\begin{array}{l}
t_0 := d1 \cdot \left(d3 + d2\right)\\
\mathbf{if}\;d2 \leq -4.5 \cdot 10^{-12}:\\
\;\;\;\;t\_0\\
\mathbf{elif}\;d2 \leq 1.45 \cdot 10^{-257}:\\
\;\;\;\;d1 \cdot 37\\
\mathbf{else}:\\
\;\;\;\;t\_0\\
\end{array}
\end{array}
if d2 < -4.49999999999999981e-12 or 1.4500000000000001e-257 < d2 Initial program 98.3%
associate-+l+N/A
+-commutativeN/A
*-commutativeN/A
distribute-lft-outN/A
distribute-lft-outN/A
*-lowering-*.f64N/A
+-lowering-+.f64N/A
associate-+l+N/A
+-lowering-+.f64N/A
metadata-eval100.0
Applied egg-rr100.0%
Taylor expanded in d3 around inf
Simplified81.8%
if -4.49999999999999981e-12 < d2 < 1.4500000000000001e-257Initial program 99.9%
Taylor expanded in d3 around 0
+-rgt-identityN/A
*-commutativeN/A
+-commutativeN/A
*-commutativeN/A
distribute-lft-outN/A
distribute-lft-outN/A
accelerator-lowering-fma.f64N/A
+-commutativeN/A
associate-+r+N/A
metadata-evalN/A
+-lowering-+.f6452.8
Simplified52.8%
Taylor expanded in d2 around 0
*-lowering-*.f6452.8
Simplified52.8%
Final simplification73.4%
NOTE: d1, d2, and d3 should be sorted in increasing order before calling this function. (FPCore (d1 d2 d3) :precision binary64 (if (<= (+ d3 5.0) 10.0) (* d1 (+ 37.0 d2)) (* d1 (+ d3 d2))))
assert(d1 < d2 && d2 < d3);
double code(double d1, double d2, double d3) {
double tmp;
if ((d3 + 5.0) <= 10.0) {
tmp = d1 * (37.0 + d2);
} else {
tmp = d1 * (d3 + d2);
}
return tmp;
}
NOTE: d1, d2, and d3 should be sorted in increasing order before calling this function.
real(8) function code(d1, d2, d3)
real(8), intent (in) :: d1
real(8), intent (in) :: d2
real(8), intent (in) :: d3
real(8) :: tmp
if ((d3 + 5.0d0) <= 10.0d0) then
tmp = d1 * (37.0d0 + d2)
else
tmp = d1 * (d3 + d2)
end if
code = tmp
end function
assert d1 < d2 && d2 < d3;
public static double code(double d1, double d2, double d3) {
double tmp;
if ((d3 + 5.0) <= 10.0) {
tmp = d1 * (37.0 + d2);
} else {
tmp = d1 * (d3 + d2);
}
return tmp;
}
[d1, d2, d3] = sort([d1, d2, d3]) def code(d1, d2, d3): tmp = 0 if (d3 + 5.0) <= 10.0: tmp = d1 * (37.0 + d2) else: tmp = d1 * (d3 + d2) return tmp
d1, d2, d3 = sort([d1, d2, d3]) function code(d1, d2, d3) tmp = 0.0 if (Float64(d3 + 5.0) <= 10.0) tmp = Float64(d1 * Float64(37.0 + d2)); else tmp = Float64(d1 * Float64(d3 + d2)); end return tmp end
d1, d2, d3 = num2cell(sort([d1, d2, d3])){:}
function tmp_2 = code(d1, d2, d3)
tmp = 0.0;
if ((d3 + 5.0) <= 10.0)
tmp = d1 * (37.0 + d2);
else
tmp = d1 * (d3 + d2);
end
tmp_2 = tmp;
end
NOTE: d1, d2, and d3 should be sorted in increasing order before calling this function. code[d1_, d2_, d3_] := If[LessEqual[N[(d3 + 5.0), $MachinePrecision], 10.0], N[(d1 * N[(37.0 + d2), $MachinePrecision]), $MachinePrecision], N[(d1 * N[(d3 + d2), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
[d1, d2, d3] = \mathsf{sort}([d1, d2, d3])\\
\\
\begin{array}{l}
\mathbf{if}\;d3 + 5 \leq 10:\\
\;\;\;\;d1 \cdot \left(37 + d2\right)\\
\mathbf{else}:\\
\;\;\;\;d1 \cdot \left(d3 + d2\right)\\
\end{array}
\end{array}
if (+.f64 d3 #s(literal 5 binary64)) < 10Initial program 99.4%
Taylor expanded in d3 around 0
+-rgt-identityN/A
*-commutativeN/A
+-commutativeN/A
*-commutativeN/A
distribute-lft-outN/A
distribute-lft-outN/A
accelerator-lowering-fma.f64N/A
+-commutativeN/A
associate-+r+N/A
metadata-evalN/A
+-lowering-+.f6471.9
Simplified71.9%
+-rgt-identityN/A
*-commutativeN/A
*-lowering-*.f64N/A
+-lowering-+.f6471.9
Applied egg-rr71.9%
if 10 < (+.f64 d3 #s(literal 5 binary64)) Initial program 96.4%
associate-+l+N/A
+-commutativeN/A
*-commutativeN/A
distribute-lft-outN/A
distribute-lft-outN/A
*-lowering-*.f64N/A
+-lowering-+.f64N/A
associate-+l+N/A
+-lowering-+.f64N/A
metadata-eval100.0
Applied egg-rr100.0%
Taylor expanded in d3 around inf
Simplified96.2%
Final simplification77.3%
NOTE: d1, d2, and d3 should be sorted in increasing order before calling this function. (FPCore (d1 d2 d3) :precision binary64 (if (<= d2 -37.0) (* d1 d2) (* d1 37.0)))
assert(d1 < d2 && d2 < d3);
double code(double d1, double d2, double d3) {
double tmp;
if (d2 <= -37.0) {
tmp = d1 * d2;
} else {
tmp = d1 * 37.0;
}
return tmp;
}
NOTE: d1, d2, and d3 should be sorted in increasing order before calling this function.
real(8) function code(d1, d2, d3)
real(8), intent (in) :: d1
real(8), intent (in) :: d2
real(8), intent (in) :: d3
real(8) :: tmp
if (d2 <= (-37.0d0)) then
tmp = d1 * d2
else
tmp = d1 * 37.0d0
end if
code = tmp
end function
assert d1 < d2 && d2 < d3;
public static double code(double d1, double d2, double d3) {
double tmp;
if (d2 <= -37.0) {
tmp = d1 * d2;
} else {
tmp = d1 * 37.0;
}
return tmp;
}
[d1, d2, d3] = sort([d1, d2, d3]) def code(d1, d2, d3): tmp = 0 if d2 <= -37.0: tmp = d1 * d2 else: tmp = d1 * 37.0 return tmp
d1, d2, d3 = sort([d1, d2, d3]) function code(d1, d2, d3) tmp = 0.0 if (d2 <= -37.0) tmp = Float64(d1 * d2); else tmp = Float64(d1 * 37.0); end return tmp end
d1, d2, d3 = num2cell(sort([d1, d2, d3])){:}
function tmp_2 = code(d1, d2, d3)
tmp = 0.0;
if (d2 <= -37.0)
tmp = d1 * d2;
else
tmp = d1 * 37.0;
end
tmp_2 = tmp;
end
NOTE: d1, d2, and d3 should be sorted in increasing order before calling this function. code[d1_, d2_, d3_] := If[LessEqual[d2, -37.0], N[(d1 * d2), $MachinePrecision], N[(d1 * 37.0), $MachinePrecision]]
\begin{array}{l}
[d1, d2, d3] = \mathsf{sort}([d1, d2, d3])\\
\\
\begin{array}{l}
\mathbf{if}\;d2 \leq -37:\\
\;\;\;\;d1 \cdot d2\\
\mathbf{else}:\\
\;\;\;\;d1 \cdot 37\\
\end{array}
\end{array}
if d2 < -37Initial program 96.9%
Taylor expanded in d2 around inf
+-rgt-identityN/A
accelerator-lowering-fma.f6477.1
Simplified77.1%
+-rgt-identityN/A
*-commutativeN/A
*-lowering-*.f6477.1
Applied egg-rr77.1%
if -37 < d2 Initial program 99.4%
Taylor expanded in d3 around 0
+-rgt-identityN/A
*-commutativeN/A
+-commutativeN/A
*-commutativeN/A
distribute-lft-outN/A
distribute-lft-outN/A
accelerator-lowering-fma.f64N/A
+-commutativeN/A
associate-+r+N/A
metadata-evalN/A
+-lowering-+.f6461.3
Simplified61.3%
Taylor expanded in d2 around 0
*-lowering-*.f6438.0
Simplified38.0%
Final simplification47.9%
NOTE: d1, d2, and d3 should be sorted in increasing order before calling this function. (FPCore (d1 d2 d3) :precision binary64 (* d1 37.0))
assert(d1 < d2 && d2 < d3);
double code(double d1, double d2, double d3) {
return d1 * 37.0;
}
NOTE: d1, d2, and d3 should be sorted in increasing order before calling this function.
real(8) function code(d1, d2, d3)
real(8), intent (in) :: d1
real(8), intent (in) :: d2
real(8), intent (in) :: d3
code = d1 * 37.0d0
end function
assert d1 < d2 && d2 < d3;
public static double code(double d1, double d2, double d3) {
return d1 * 37.0;
}
[d1, d2, d3] = sort([d1, d2, d3]) def code(d1, d2, d3): return d1 * 37.0
d1, d2, d3 = sort([d1, d2, d3]) function code(d1, d2, d3) return Float64(d1 * 37.0) end
d1, d2, d3 = num2cell(sort([d1, d2, d3])){:}
function tmp = code(d1, d2, d3)
tmp = d1 * 37.0;
end
NOTE: d1, d2, and d3 should be sorted in increasing order before calling this function. code[d1_, d2_, d3_] := N[(d1 * 37.0), $MachinePrecision]
\begin{array}{l}
[d1, d2, d3] = \mathsf{sort}([d1, d2, d3])\\
\\
d1 \cdot 37
\end{array}
Initial program 98.8%
Taylor expanded in d3 around 0
+-rgt-identityN/A
*-commutativeN/A
+-commutativeN/A
*-commutativeN/A
distribute-lft-outN/A
distribute-lft-outN/A
accelerator-lowering-fma.f64N/A
+-commutativeN/A
associate-+r+N/A
metadata-evalN/A
+-lowering-+.f6465.9
Simplified65.9%
Taylor expanded in d2 around 0
*-lowering-*.f6428.9
Simplified28.9%
Final simplification28.9%
(FPCore (d1 d2 d3) :precision binary64 (* d1 (+ (+ 37.0 d3) d2)))
double code(double d1, double d2, double d3) {
return d1 * ((37.0 + d3) + d2);
}
real(8) function code(d1, d2, d3)
real(8), intent (in) :: d1
real(8), intent (in) :: d2
real(8), intent (in) :: d3
code = d1 * ((37.0d0 + d3) + d2)
end function
public static double code(double d1, double d2, double d3) {
return d1 * ((37.0 + d3) + d2);
}
def code(d1, d2, d3): return d1 * ((37.0 + d3) + d2)
function code(d1, d2, d3) return Float64(d1 * Float64(Float64(37.0 + d3) + d2)) end
function tmp = code(d1, d2, d3) tmp = d1 * ((37.0 + d3) + d2); end
code[d1_, d2_, d3_] := N[(d1 * N[(N[(37.0 + d3), $MachinePrecision] + d2), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
d1 \cdot \left(\left(37 + d3\right) + d2\right)
\end{array}
herbie shell --seed 2024194
(FPCore (d1 d2 d3)
:name "FastMath dist3"
:precision binary64
:alt
(! :herbie-platform default (* d1 (+ 37 d3 d2)))
(+ (+ (* d1 d2) (* (+ d3 5.0) d1)) (* d1 32.0)))