
(FPCore (d1 d2 d3) :precision binary64 (+ (+ (* d1 3.0) (* d1 d2)) (* d1 d3)))
double code(double d1, double d2, double d3) {
return ((d1 * 3.0) + (d1 * d2)) + (d1 * d3);
}
real(8) function code(d1, d2, d3)
real(8), intent (in) :: d1
real(8), intent (in) :: d2
real(8), intent (in) :: d3
code = ((d1 * 3.0d0) + (d1 * d2)) + (d1 * d3)
end function
public static double code(double d1, double d2, double d3) {
return ((d1 * 3.0) + (d1 * d2)) + (d1 * d3);
}
def code(d1, d2, d3): return ((d1 * 3.0) + (d1 * d2)) + (d1 * d3)
function code(d1, d2, d3) return Float64(Float64(Float64(d1 * 3.0) + Float64(d1 * d2)) + Float64(d1 * d3)) end
function tmp = code(d1, d2, d3) tmp = ((d1 * 3.0) + (d1 * d2)) + (d1 * d3); end
code[d1_, d2_, d3_] := N[(N[(N[(d1 * 3.0), $MachinePrecision] + N[(d1 * d2), $MachinePrecision]), $MachinePrecision] + N[(d1 * d3), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\left(d1 \cdot 3 + d1 \cdot d2\right) + d1 \cdot d3
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 7 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (d1 d2 d3) :precision binary64 (+ (+ (* d1 3.0) (* d1 d2)) (* d1 d3)))
double code(double d1, double d2, double d3) {
return ((d1 * 3.0) + (d1 * d2)) + (d1 * d3);
}
real(8) function code(d1, d2, d3)
real(8), intent (in) :: d1
real(8), intent (in) :: d2
real(8), intent (in) :: d3
code = ((d1 * 3.0d0) + (d1 * d2)) + (d1 * d3)
end function
public static double code(double d1, double d2, double d3) {
return ((d1 * 3.0) + (d1 * d2)) + (d1 * d3);
}
def code(d1, d2, d3): return ((d1 * 3.0) + (d1 * d2)) + (d1 * d3)
function code(d1, d2, d3) return Float64(Float64(Float64(d1 * 3.0) + Float64(d1 * d2)) + Float64(d1 * d3)) end
function tmp = code(d1, d2, d3) tmp = ((d1 * 3.0) + (d1 * d2)) + (d1 * d3); end
code[d1_, d2_, d3_] := N[(N[(N[(d1 * 3.0), $MachinePrecision] + N[(d1 * d2), $MachinePrecision]), $MachinePrecision] + N[(d1 * d3), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\left(d1 \cdot 3 + d1 \cdot d2\right) + d1 \cdot d3
\end{array}
(FPCore (d1 d2 d3) :precision binary64 (fma d1 3.0 (* d1 (+ d2 d3))))
double code(double d1, double d2, double d3) {
return fma(d1, 3.0, (d1 * (d2 + d3)));
}
function code(d1, d2, d3) return fma(d1, 3.0, Float64(d1 * Float64(d2 + d3))) end
code[d1_, d2_, d3_] := N[(d1 * 3.0 + N[(d1 * N[(d2 + d3), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\mathsf{fma}\left(d1, 3, d1 \cdot \left(d2 + d3\right)\right)
\end{array}
Initial program 98.7%
distribute-lft-out98.7%
distribute-lft-out99.9%
Simplified99.9%
distribute-lft-in98.7%
distribute-lft-out98.7%
associate-+l+98.7%
fma-def98.8%
distribute-lft-out100.0%
Applied egg-rr100.0%
Final simplification100.0%
(FPCore (d1 d2 d3) :precision binary64 (* d1 (+ d3 (+ 3.0 d2))))
double code(double d1, double d2, double d3) {
return d1 * (d3 + (3.0 + 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 * (d3 + (3.0d0 + d2))
end function
public static double code(double d1, double d2, double d3) {
return d1 * (d3 + (3.0 + d2));
}
def code(d1, d2, d3): return d1 * (d3 + (3.0 + d2))
function code(d1, d2, d3) return Float64(d1 * Float64(d3 + Float64(3.0 + d2))) end
function tmp = code(d1, d2, d3) tmp = d1 * (d3 + (3.0 + d2)); end
code[d1_, d2_, d3_] := N[(d1 * N[(d3 + N[(3.0 + d2), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
d1 \cdot \left(d3 + \left(3 + d2\right)\right)
\end{array}
Initial program 98.7%
distribute-lft-out98.7%
distribute-lft-out99.9%
Simplified99.9%
Final simplification99.9%
(FPCore (d1 d2 d3) :precision binary64 (* d1 (+ 3.0 d2)))
double code(double d1, double d2, double d3) {
return d1 * (3.0 + 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 * (3.0d0 + d2)
end function
public static double code(double d1, double d2, double d3) {
return d1 * (3.0 + d2);
}
def code(d1, d2, d3): return d1 * (3.0 + d2)
function code(d1, d2, d3) return Float64(d1 * Float64(3.0 + d2)) end
function tmp = code(d1, d2, d3) tmp = d1 * (3.0 + d2); end
code[d1_, d2_, d3_] := N[(d1 * N[(3.0 + d2), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
d1 \cdot \left(3 + d2\right)
\end{array}
Initial program 98.7%
distribute-lft-out98.7%
distribute-lft-out99.9%
Simplified99.9%
Taylor expanded in d3 around 0 62.8%
Final simplification62.8%
(FPCore (d1 d2 d3) :precision binary64 (* d1 (+ 3.0 d3)))
double code(double d1, double d2, double d3) {
return d1 * (3.0 + d3);
}
real(8) function code(d1, d2, d3)
real(8), intent (in) :: d1
real(8), intent (in) :: d2
real(8), intent (in) :: d3
code = d1 * (3.0d0 + d3)
end function
public static double code(double d1, double d2, double d3) {
return d1 * (3.0 + d3);
}
def code(d1, d2, d3): return d1 * (3.0 + d3)
function code(d1, d2, d3) return Float64(d1 * Float64(3.0 + d3)) end
function tmp = code(d1, d2, d3) tmp = d1 * (3.0 + d3); end
code[d1_, d2_, d3_] := N[(d1 * N[(3.0 + d3), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
d1 \cdot \left(3 + d3\right)
\end{array}
Initial program 98.7%
distribute-lft-out98.7%
distribute-lft-out99.9%
Simplified99.9%
Taylor expanded in d2 around 0 66.7%
Final simplification66.7%
(FPCore (d1 d2 d3) :precision binary64 (* d1 3.0))
double code(double d1, double d2, double d3) {
return d1 * 3.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 * 3.0d0
end function
public static double code(double d1, double d2, double d3) {
return d1 * 3.0;
}
def code(d1, d2, d3): return d1 * 3.0
function code(d1, d2, d3) return Float64(d1 * 3.0) end
function tmp = code(d1, d2, d3) tmp = d1 * 3.0; end
code[d1_, d2_, d3_] := N[(d1 * 3.0), $MachinePrecision]
\begin{array}{l}
\\
d1 \cdot 3
\end{array}
Initial program 98.7%
distribute-lft-out98.7%
distribute-lft-out99.9%
Simplified99.9%
Taylor expanded in d3 around 0 62.8%
Taylor expanded in d2 around 0 29.3%
*-commutative29.3%
Simplified29.3%
Final simplification29.3%
(FPCore (d1 d2 d3) :precision binary64 (* d1 d2))
double code(double d1, double d2, double d3) {
return d1 * 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 * d2
end function
public static double code(double d1, double d2, double d3) {
return d1 * d2;
}
def code(d1, d2, d3): return d1 * d2
function code(d1, d2, d3) return Float64(d1 * d2) end
function tmp = code(d1, d2, d3) tmp = d1 * d2; end
code[d1_, d2_, d3_] := N[(d1 * d2), $MachinePrecision]
\begin{array}{l}
\\
d1 \cdot d2
\end{array}
Initial program 98.7%
distribute-lft-out98.7%
distribute-lft-out99.9%
Simplified99.9%
Taylor expanded in d2 around inf 36.4%
Final simplification36.4%
(FPCore (d1 d2 d3) :precision binary64 (* d1 d3))
double code(double d1, double d2, double d3) {
return d1 * d3;
}
real(8) function code(d1, d2, d3)
real(8), intent (in) :: d1
real(8), intent (in) :: d2
real(8), intent (in) :: d3
code = d1 * d3
end function
public static double code(double d1, double d2, double d3) {
return d1 * d3;
}
def code(d1, d2, d3): return d1 * d3
function code(d1, d2, d3) return Float64(d1 * d3) end
function tmp = code(d1, d2, d3) tmp = d1 * d3; end
code[d1_, d2_, d3_] := N[(d1 * d3), $MachinePrecision]
\begin{array}{l}
\\
d1 \cdot d3
\end{array}
Initial program 98.7%
distribute-lft-out98.7%
distribute-lft-out99.9%
Simplified99.9%
Taylor expanded in d3 around inf 39.7%
Final simplification39.7%
(FPCore (d1 d2 d3) :precision binary64 (* d1 (+ (+ 3.0 d2) d3)))
double code(double d1, double d2, double d3) {
return d1 * ((3.0 + d2) + d3);
}
real(8) function code(d1, d2, d3)
real(8), intent (in) :: d1
real(8), intent (in) :: d2
real(8), intent (in) :: d3
code = d1 * ((3.0d0 + d2) + d3)
end function
public static double code(double d1, double d2, double d3) {
return d1 * ((3.0 + d2) + d3);
}
def code(d1, d2, d3): return d1 * ((3.0 + d2) + d3)
function code(d1, d2, d3) return Float64(d1 * Float64(Float64(3.0 + d2) + d3)) end
function tmp = code(d1, d2, d3) tmp = d1 * ((3.0 + d2) + d3); end
code[d1_, d2_, d3_] := N[(d1 * N[(N[(3.0 + d2), $MachinePrecision] + d3), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
d1 \cdot \left(\left(3 + d2\right) + d3\right)
\end{array}
herbie shell --seed 2024033
(FPCore (d1 d2 d3)
:name "FastMath test3"
:precision binary64
:herbie-target
(* d1 (+ (+ 3.0 d2) d3))
(+ (+ (* d1 3.0) (* d1 d2)) (* d1 d3)))