
(FPCore (x y z t) :precision binary64 (+ (/ x y) (/ (+ 2.0 (* (* z 2.0) (- 1.0 t))) (* t z))))
double code(double x, double y, double z, double t) {
return (x / y) + ((2.0 + ((z * 2.0) * (1.0 - t))) / (t * z));
}
real(8) function code(x, y, z, t)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
real(8), intent (in) :: t
code = (x / y) + ((2.0d0 + ((z * 2.0d0) * (1.0d0 - t))) / (t * z))
end function
public static double code(double x, double y, double z, double t) {
return (x / y) + ((2.0 + ((z * 2.0) * (1.0 - t))) / (t * z));
}
def code(x, y, z, t): return (x / y) + ((2.0 + ((z * 2.0) * (1.0 - t))) / (t * z))
function code(x, y, z, t) return Float64(Float64(x / y) + Float64(Float64(2.0 + Float64(Float64(z * 2.0) * Float64(1.0 - t))) / Float64(t * z))) end
function tmp = code(x, y, z, t) tmp = (x / y) + ((2.0 + ((z * 2.0) * (1.0 - t))) / (t * z)); end
code[x_, y_, z_, t_] := N[(N[(x / y), $MachinePrecision] + N[(N[(2.0 + N[(N[(z * 2.0), $MachinePrecision] * N[(1.0 - t), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N[(t * z), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{x}{y} + \frac{2 + \left(z \cdot 2\right) \cdot \left(1 - t\right)}{t \cdot z}
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 6 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (x y z t) :precision binary64 (+ (/ x y) (/ (+ 2.0 (* (* z 2.0) (- 1.0 t))) (* t z))))
double code(double x, double y, double z, double t) {
return (x / y) + ((2.0 + ((z * 2.0) * (1.0 - t))) / (t * z));
}
real(8) function code(x, y, z, t)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
real(8), intent (in) :: t
code = (x / y) + ((2.0d0 + ((z * 2.0d0) * (1.0d0 - t))) / (t * z))
end function
public static double code(double x, double y, double z, double t) {
return (x / y) + ((2.0 + ((z * 2.0) * (1.0 - t))) / (t * z));
}
def code(x, y, z, t): return (x / y) + ((2.0 + ((z * 2.0) * (1.0 - t))) / (t * z))
function code(x, y, z, t) return Float64(Float64(x / y) + Float64(Float64(2.0 + Float64(Float64(z * 2.0) * Float64(1.0 - t))) / Float64(t * z))) end
function tmp = code(x, y, z, t) tmp = (x / y) + ((2.0 + ((z * 2.0) * (1.0 - t))) / (t * z)); end
code[x_, y_, z_, t_] := N[(N[(x / y), $MachinePrecision] + N[(N[(2.0 + N[(N[(z * 2.0), $MachinePrecision] * N[(1.0 - t), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] / N[(t * z), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{x}{y} + \frac{2 + \left(z \cdot 2\right) \cdot \left(1 - t\right)}{t \cdot z}
\end{array}
(FPCore (x y z t) :precision binary64 (+ (+ (* 2.0 (/ (+ 1.0 z) (* z t))) (/ x y)) -2.0))
double code(double x, double y, double z, double t) {
return ((2.0 * ((1.0 + z) / (z * t))) + (x / y)) + -2.0;
}
real(8) function code(x, y, z, t)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
real(8), intent (in) :: t
code = ((2.0d0 * ((1.0d0 + z) / (z * t))) + (x / y)) + (-2.0d0)
end function
public static double code(double x, double y, double z, double t) {
return ((2.0 * ((1.0 + z) / (z * t))) + (x / y)) + -2.0;
}
def code(x, y, z, t): return ((2.0 * ((1.0 + z) / (z * t))) + (x / y)) + -2.0
function code(x, y, z, t) return Float64(Float64(Float64(2.0 * Float64(Float64(1.0 + z) / Float64(z * t))) + Float64(x / y)) + -2.0) end
function tmp = code(x, y, z, t) tmp = ((2.0 * ((1.0 + z) / (z * t))) + (x / y)) + -2.0; end
code[x_, y_, z_, t_] := N[(N[(N[(2.0 * N[(N[(1.0 + z), $MachinePrecision] / N[(z * t), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] + N[(x / y), $MachinePrecision]), $MachinePrecision] + -2.0), $MachinePrecision]
\begin{array}{l}
\\
\left(2 \cdot \frac{1 + z}{z \cdot t} + \frac{x}{y}\right) + -2
\end{array}
Initial program 90.1%
+-commutative90.1%
remove-double-neg90.1%
distribute-frac-neg90.1%
unsub-neg90.1%
*-commutative90.1%
associate-*r*90.1%
distribute-rgt1-in90.1%
associate-*r/90.0%
/-rgt-identity90.0%
fma-neg90.0%
/-rgt-identity90.0%
*-commutative90.0%
fma-def90.0%
*-commutative90.0%
distribute-frac-neg90.0%
remove-double-neg90.0%
Simplified90.0%
Taylor expanded in t around 0 99.0%
Final simplification99.0%
(FPCore (x y z t) :precision binary64 (+ (/ x y) (/ (+ 2.0 (* 2.0 z)) (* z t))))
double code(double x, double y, double z, double t) {
return (x / y) + ((2.0 + (2.0 * z)) / (z * t));
}
real(8) function code(x, y, z, t)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
real(8), intent (in) :: t
code = (x / y) + ((2.0d0 + (2.0d0 * z)) / (z * t))
end function
public static double code(double x, double y, double z, double t) {
return (x / y) + ((2.0 + (2.0 * z)) / (z * t));
}
def code(x, y, z, t): return (x / y) + ((2.0 + (2.0 * z)) / (z * t))
function code(x, y, z, t) return Float64(Float64(x / y) + Float64(Float64(2.0 + Float64(2.0 * z)) / Float64(z * t))) end
function tmp = code(x, y, z, t) tmp = (x / y) + ((2.0 + (2.0 * z)) / (z * t)); end
code[x_, y_, z_, t_] := N[(N[(x / y), $MachinePrecision] + N[(N[(2.0 + N[(2.0 * z), $MachinePrecision]), $MachinePrecision] / N[(z * t), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{x}{y} + \frac{2 + 2 \cdot z}{z \cdot t}
\end{array}
Initial program 90.1%
Taylor expanded in t around 0 81.8%
Final simplification81.8%
(FPCore (x y z t) :precision binary64 (+ (/ x y) (/ (/ 2.0 t) z)))
double code(double x, double y, double z, double t) {
return (x / y) + ((2.0 / t) / z);
}
real(8) function code(x, y, z, t)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
real(8), intent (in) :: t
code = (x / y) + ((2.0d0 / t) / z)
end function
public static double code(double x, double y, double z, double t) {
return (x / y) + ((2.0 / t) / z);
}
def code(x, y, z, t): return (x / y) + ((2.0 / t) / z)
function code(x, y, z, t) return Float64(Float64(x / y) + Float64(Float64(2.0 / t) / z)) end
function tmp = code(x, y, z, t) tmp = (x / y) + ((2.0 / t) / z); end
code[x_, y_, z_, t_] := N[(N[(x / y), $MachinePrecision] + N[(N[(2.0 / t), $MachinePrecision] / z), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{x}{y} + \frac{\frac{2}{t}}{z}
\end{array}
Initial program 90.1%
Taylor expanded in z around 0 69.1%
associate-/r*69.1%
Simplified69.1%
Final simplification69.1%
(FPCore (x y z t) :precision binary64 (+ (/ x y) -2.0))
double code(double x, double y, double z, double t) {
return (x / y) + -2.0;
}
real(8) function code(x, y, z, t)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
real(8), intent (in) :: t
code = (x / y) + (-2.0d0)
end function
public static double code(double x, double y, double z, double t) {
return (x / y) + -2.0;
}
def code(x, y, z, t): return (x / y) + -2.0
function code(x, y, z, t) return Float64(Float64(x / y) + -2.0) end
function tmp = code(x, y, z, t) tmp = (x / y) + -2.0; end
code[x_, y_, z_, t_] := N[(N[(x / y), $MachinePrecision] + -2.0), $MachinePrecision]
\begin{array}{l}
\\
\frac{x}{y} + -2
\end{array}
Initial program 90.1%
Taylor expanded in t around inf 55.2%
Final simplification55.2%
(FPCore (x y z t) :precision binary64 (/ x y))
double code(double x, double y, double z, double t) {
return x / y;
}
real(8) function code(x, y, z, t)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
real(8), intent (in) :: t
code = x / y
end function
public static double code(double x, double y, double z, double t) {
return x / y;
}
def code(x, y, z, t): return x / y
function code(x, y, z, t) return Float64(x / y) end
function tmp = code(x, y, z, t) tmp = x / y; end
code[x_, y_, z_, t_] := N[(x / y), $MachinePrecision]
\begin{array}{l}
\\
\frac{x}{y}
\end{array}
Initial program 90.1%
Taylor expanded in x around inf 38.3%
Final simplification38.3%
(FPCore (x y z t) :precision binary64 -2.0)
double code(double x, double y, double z, double t) {
return -2.0;
}
real(8) function code(x, y, z, t)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
real(8), intent (in) :: t
code = -2.0d0
end function
public static double code(double x, double y, double z, double t) {
return -2.0;
}
def code(x, y, z, t): return -2.0
function code(x, y, z, t) return -2.0 end
function tmp = code(x, y, z, t) tmp = -2.0; end
code[x_, y_, z_, t_] := -2.0
\begin{array}{l}
\\
-2
\end{array}
Initial program 90.1%
+-commutative90.1%
remove-double-neg90.1%
distribute-frac-neg90.1%
unsub-neg90.1%
*-commutative90.1%
associate-*r*90.1%
distribute-rgt1-in90.1%
associate-*r/90.0%
/-rgt-identity90.0%
fma-neg90.0%
/-rgt-identity90.0%
*-commutative90.0%
fma-def90.0%
*-commutative90.0%
distribute-frac-neg90.0%
remove-double-neg90.0%
Simplified90.0%
Taylor expanded in x around 0 58.5%
Taylor expanded in t around inf 18.8%
Final simplification18.8%
(FPCore (x y z t) :precision binary64 (- (/ (+ (/ 2.0 z) 2.0) t) (- 2.0 (/ x y))))
double code(double x, double y, double z, double t) {
return (((2.0 / z) + 2.0) / t) - (2.0 - (x / y));
}
real(8) function code(x, y, z, t)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
real(8), intent (in) :: t
code = (((2.0d0 / z) + 2.0d0) / t) - (2.0d0 - (x / y))
end function
public static double code(double x, double y, double z, double t) {
return (((2.0 / z) + 2.0) / t) - (2.0 - (x / y));
}
def code(x, y, z, t): return (((2.0 / z) + 2.0) / t) - (2.0 - (x / y))
function code(x, y, z, t) return Float64(Float64(Float64(Float64(2.0 / z) + 2.0) / t) - Float64(2.0 - Float64(x / y))) end
function tmp = code(x, y, z, t) tmp = (((2.0 / z) + 2.0) / t) - (2.0 - (x / y)); end
code[x_, y_, z_, t_] := N[(N[(N[(N[(2.0 / z), $MachinePrecision] + 2.0), $MachinePrecision] / t), $MachinePrecision] - N[(2.0 - N[(x / y), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\frac{\frac{2}{z} + 2}{t} - \left(2 - \frac{x}{y}\right)
\end{array}
herbie shell --seed 2024033
(FPCore (x y z t)
:name "Data.HashTable.ST.Basic:computeOverhead from hashtables-1.2.0.2"
:precision binary64
:herbie-target
(- (/ (+ (/ 2.0 z) 2.0) t) (- 2.0 (/ x y)))
(+ (/ x y) (/ (+ 2.0 (* (* z 2.0) (- 1.0 t))) (* t z))))