
(FPCore (x y z) :precision binary64 (+ (+ (+ (+ (+ x y) y) x) z) x))
double code(double x, double y, double z) {
return ((((x + y) + y) + x) + z) + x;
}
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) + y) + x) + z) + x
end function
public static double code(double x, double y, double z) {
return ((((x + y) + y) + x) + z) + x;
}
def code(x, y, z): return ((((x + y) + y) + x) + z) + x
function code(x, y, z) return Float64(Float64(Float64(Float64(Float64(x + y) + y) + x) + z) + x) end
function tmp = code(x, y, z) tmp = ((((x + y) + y) + x) + z) + x; end
code[x_, y_, z_] := N[(N[(N[(N[(N[(x + y), $MachinePrecision] + y), $MachinePrecision] + x), $MachinePrecision] + z), $MachinePrecision] + x), $MachinePrecision]
\begin{array}{l}
\\
\left(\left(\left(\left(x + y\right) + y\right) + x\right) + z\right) + x
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 10 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (x y z) :precision binary64 (+ (+ (+ (+ (+ x y) y) x) z) x))
double code(double x, double y, double z) {
return ((((x + y) + y) + x) + z) + x;
}
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) + y) + x) + z) + x
end function
public static double code(double x, double y, double z) {
return ((((x + y) + y) + x) + z) + x;
}
def code(x, y, z): return ((((x + y) + y) + x) + z) + x
function code(x, y, z) return Float64(Float64(Float64(Float64(Float64(x + y) + y) + x) + z) + x) end
function tmp = code(x, y, z) tmp = ((((x + y) + y) + x) + z) + x; end
code[x_, y_, z_] := N[(N[(N[(N[(N[(x + y), $MachinePrecision] + y), $MachinePrecision] + x), $MachinePrecision] + z), $MachinePrecision] + x), $MachinePrecision]
\begin{array}{l}
\\
\left(\left(\left(\left(x + y\right) + y\right) + x\right) + z\right) + x
\end{array}
(FPCore (x y z) :precision binary64 (+ (+ z (+ (+ (+ y x) y) x)) x))
double code(double x, double y, double z) {
return (z + (((y + x) + y) + x)) + x;
}
real(8) function code(x, y, z)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
code = (z + (((y + x) + y) + x)) + x
end function
public static double code(double x, double y, double z) {
return (z + (((y + x) + y) + x)) + x;
}
def code(x, y, z): return (z + (((y + x) + y) + x)) + x
function code(x, y, z) return Float64(Float64(z + Float64(Float64(Float64(y + x) + y) + x)) + x) end
function tmp = code(x, y, z) tmp = (z + (((y + x) + y) + x)) + x; end
code[x_, y_, z_] := N[(N[(z + N[(N[(N[(y + x), $MachinePrecision] + y), $MachinePrecision] + x), $MachinePrecision]), $MachinePrecision] + x), $MachinePrecision]
\begin{array}{l}
\\
\left(z + \left(\left(\left(y + x\right) + y\right) + x\right)\right) + x
\end{array}
Initial program 99.9%
Final simplification99.9%
(FPCore (x y z) :precision binary64 (if (<= z -4.1e+55) (fma 3.0 x z) (if (<= z 2.65e-30) (fma 3.0 x (+ y y)) (+ (+ (+ z y) (+ y x)) x))))
double code(double x, double y, double z) {
double tmp;
if (z <= -4.1e+55) {
tmp = fma(3.0, x, z);
} else if (z <= 2.65e-30) {
tmp = fma(3.0, x, (y + y));
} else {
tmp = ((z + y) + (y + x)) + x;
}
return tmp;
}
function code(x, y, z) tmp = 0.0 if (z <= -4.1e+55) tmp = fma(3.0, x, z); elseif (z <= 2.65e-30) tmp = fma(3.0, x, Float64(y + y)); else tmp = Float64(Float64(Float64(z + y) + Float64(y + x)) + x); end return tmp end
code[x_, y_, z_] := If[LessEqual[z, -4.1e+55], N[(3.0 * x + z), $MachinePrecision], If[LessEqual[z, 2.65e-30], N[(3.0 * x + N[(y + y), $MachinePrecision]), $MachinePrecision], N[(N[(N[(z + y), $MachinePrecision] + N[(y + x), $MachinePrecision]), $MachinePrecision] + x), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;z \leq -4.1 \cdot 10^{+55}:\\
\;\;\;\;\mathsf{fma}\left(3, x, z\right)\\
\mathbf{elif}\;z \leq 2.65 \cdot 10^{-30}:\\
\;\;\;\;\mathsf{fma}\left(3, x, y + y\right)\\
\mathbf{else}:\\
\;\;\;\;\left(\left(z + y\right) + \left(y + x\right)\right) + x\\
\end{array}
\end{array}
if z < -4.09999999999999981e55Initial program 100.0%
Taylor expanded in y around 0
+-commutativeN/A
associate-+r+N/A
distribute-rgt1-inN/A
metadata-evalN/A
lower-fma.f6486.1
Applied rewrites86.1%
if -4.09999999999999981e55 < z < 2.64999999999999987e-30Initial program 99.8%
Taylor expanded in z around 0
associate-+r+N/A
distribute-rgt1-inN/A
metadata-evalN/A
lower-fma.f64N/A
lower-*.f6493.6
Applied rewrites93.6%
Applied rewrites93.6%
if 2.64999999999999987e-30 < z Initial program 100.0%
lift-+.f64N/A
+-commutativeN/A
lift-+.f64N/A
lift-+.f64N/A
associate-+l+N/A
+-commutativeN/A
lift-+.f64N/A
associate-+r+N/A
lower-+.f64N/A
lower-+.f64100.0
lift-+.f64N/A
+-commutativeN/A
lower-+.f64100.0
lift-+.f64N/A
+-commutativeN/A
lower-+.f64100.0
Applied rewrites100.0%
Taylor expanded in x around 0
lower-+.f6495.4
Applied rewrites95.4%
Final simplification92.6%
(FPCore (x y z) :precision binary64 (if (<= z -4.1e+55) (fma 3.0 x z) (if (<= z 6e-30) (fma 3.0 x (+ y y)) (+ (fma 2.0 y z) x))))
double code(double x, double y, double z) {
double tmp;
if (z <= -4.1e+55) {
tmp = fma(3.0, x, z);
} else if (z <= 6e-30) {
tmp = fma(3.0, x, (y + y));
} else {
tmp = fma(2.0, y, z) + x;
}
return tmp;
}
function code(x, y, z) tmp = 0.0 if (z <= -4.1e+55) tmp = fma(3.0, x, z); elseif (z <= 6e-30) tmp = fma(3.0, x, Float64(y + y)); else tmp = Float64(fma(2.0, y, z) + x); end return tmp end
code[x_, y_, z_] := If[LessEqual[z, -4.1e+55], N[(3.0 * x + z), $MachinePrecision], If[LessEqual[z, 6e-30], N[(3.0 * x + N[(y + y), $MachinePrecision]), $MachinePrecision], N[(N[(2.0 * y + z), $MachinePrecision] + x), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;z \leq -4.1 \cdot 10^{+55}:\\
\;\;\;\;\mathsf{fma}\left(3, x, z\right)\\
\mathbf{elif}\;z \leq 6 \cdot 10^{-30}:\\
\;\;\;\;\mathsf{fma}\left(3, x, y + y\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(2, y, z\right) + x\\
\end{array}
\end{array}
if z < -4.09999999999999981e55Initial program 100.0%
Taylor expanded in y around 0
+-commutativeN/A
associate-+r+N/A
distribute-rgt1-inN/A
metadata-evalN/A
lower-fma.f6486.1
Applied rewrites86.1%
if -4.09999999999999981e55 < z < 5.9999999999999998e-30Initial program 99.8%
Taylor expanded in z around 0
associate-+r+N/A
distribute-rgt1-inN/A
metadata-evalN/A
lower-fma.f64N/A
lower-*.f6493.6
Applied rewrites93.6%
Applied rewrites93.6%
if 5.9999999999999998e-30 < z Initial program 100.0%
Taylor expanded in x around 0
+-commutativeN/A
lower-fma.f6495.3
Applied rewrites95.3%
(FPCore (x y z) :precision binary64 (if (<= z -4.1e+55) (fma 3.0 x z) (if (<= z 6e-30) (fma 3.0 x (+ y y)) (+ (+ z y) y))))
double code(double x, double y, double z) {
double tmp;
if (z <= -4.1e+55) {
tmp = fma(3.0, x, z);
} else if (z <= 6e-30) {
tmp = fma(3.0, x, (y + y));
} else {
tmp = (z + y) + y;
}
return tmp;
}
function code(x, y, z) tmp = 0.0 if (z <= -4.1e+55) tmp = fma(3.0, x, z); elseif (z <= 6e-30) tmp = fma(3.0, x, Float64(y + y)); else tmp = Float64(Float64(z + y) + y); end return tmp end
code[x_, y_, z_] := If[LessEqual[z, -4.1e+55], N[(3.0 * x + z), $MachinePrecision], If[LessEqual[z, 6e-30], N[(3.0 * x + N[(y + y), $MachinePrecision]), $MachinePrecision], N[(N[(z + y), $MachinePrecision] + y), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;z \leq -4.1 \cdot 10^{+55}:\\
\;\;\;\;\mathsf{fma}\left(3, x, z\right)\\
\mathbf{elif}\;z \leq 6 \cdot 10^{-30}:\\
\;\;\;\;\mathsf{fma}\left(3, x, y + y\right)\\
\mathbf{else}:\\
\;\;\;\;\left(z + y\right) + y\\
\end{array}
\end{array}
if z < -4.09999999999999981e55Initial program 100.0%
Taylor expanded in y around 0
+-commutativeN/A
associate-+r+N/A
distribute-rgt1-inN/A
metadata-evalN/A
lower-fma.f6486.1
Applied rewrites86.1%
if -4.09999999999999981e55 < z < 5.9999999999999998e-30Initial program 99.8%
Taylor expanded in z around 0
associate-+r+N/A
distribute-rgt1-inN/A
metadata-evalN/A
lower-fma.f64N/A
lower-*.f6493.6
Applied rewrites93.6%
Applied rewrites93.6%
if 5.9999999999999998e-30 < z Initial program 100.0%
Taylor expanded in z around 0
associate-+r+N/A
distribute-rgt1-inN/A
metadata-evalN/A
lower-fma.f64N/A
lower-*.f6429.0
Applied rewrites29.0%
Taylor expanded in x around 0
Applied rewrites24.3%
Taylor expanded in x around 0
+-commutativeN/A
lower-fma.f6494.6
Applied rewrites94.6%
Applied rewrites94.6%
(FPCore (x y z) :precision binary64 (if (<= y -7.4e+56) (fma 2.0 y z) (if (<= y 2.95e+54) (fma 3.0 x z) (+ (+ z y) y))))
double code(double x, double y, double z) {
double tmp;
if (y <= -7.4e+56) {
tmp = fma(2.0, y, z);
} else if (y <= 2.95e+54) {
tmp = fma(3.0, x, z);
} else {
tmp = (z + y) + y;
}
return tmp;
}
function code(x, y, z) tmp = 0.0 if (y <= -7.4e+56) tmp = fma(2.0, y, z); elseif (y <= 2.95e+54) tmp = fma(3.0, x, z); else tmp = Float64(Float64(z + y) + y); end return tmp end
code[x_, y_, z_] := If[LessEqual[y, -7.4e+56], N[(2.0 * y + z), $MachinePrecision], If[LessEqual[y, 2.95e+54], N[(3.0 * x + z), $MachinePrecision], N[(N[(z + y), $MachinePrecision] + y), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;y \leq -7.4 \cdot 10^{+56}:\\
\;\;\;\;\mathsf{fma}\left(2, y, z\right)\\
\mathbf{elif}\;y \leq 2.95 \cdot 10^{+54}:\\
\;\;\;\;\mathsf{fma}\left(3, x, z\right)\\
\mathbf{else}:\\
\;\;\;\;\left(z + y\right) + y\\
\end{array}
\end{array}
if y < -7.39999999999999994e56Initial program 99.9%
Taylor expanded in z around 0
associate-+r+N/A
distribute-rgt1-inN/A
metadata-evalN/A
lower-fma.f64N/A
lower-*.f6482.5
Applied rewrites82.5%
Taylor expanded in x around 0
Applied rewrites72.1%
Taylor expanded in x around 0
+-commutativeN/A
lower-fma.f6489.6
Applied rewrites89.6%
if -7.39999999999999994e56 < y < 2.9499999999999999e54Initial program 99.9%
Taylor expanded in y around 0
+-commutativeN/A
associate-+r+N/A
distribute-rgt1-inN/A
metadata-evalN/A
lower-fma.f6492.1
Applied rewrites92.1%
if 2.9499999999999999e54 < y Initial program 99.9%
Taylor expanded in z around 0
associate-+r+N/A
distribute-rgt1-inN/A
metadata-evalN/A
lower-fma.f64N/A
lower-*.f6486.1
Applied rewrites86.1%
Taylor expanded in x around 0
Applied rewrites69.3%
Taylor expanded in x around 0
+-commutativeN/A
lower-fma.f6483.1
Applied rewrites83.1%
Applied rewrites83.1%
(FPCore (x y z) :precision binary64 (if (<= x -5.5e+139) (* 3.0 x) (if (<= x 1.55e+91) (fma 2.0 y z) (* 3.0 x))))
double code(double x, double y, double z) {
double tmp;
if (x <= -5.5e+139) {
tmp = 3.0 * x;
} else if (x <= 1.55e+91) {
tmp = fma(2.0, y, z);
} else {
tmp = 3.0 * x;
}
return tmp;
}
function code(x, y, z) tmp = 0.0 if (x <= -5.5e+139) tmp = Float64(3.0 * x); elseif (x <= 1.55e+91) tmp = fma(2.0, y, z); else tmp = Float64(3.0 * x); end return tmp end
code[x_, y_, z_] := If[LessEqual[x, -5.5e+139], N[(3.0 * x), $MachinePrecision], If[LessEqual[x, 1.55e+91], N[(2.0 * y + z), $MachinePrecision], N[(3.0 * x), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;x \leq -5.5 \cdot 10^{+139}:\\
\;\;\;\;3 \cdot x\\
\mathbf{elif}\;x \leq 1.55 \cdot 10^{+91}:\\
\;\;\;\;\mathsf{fma}\left(2, y, z\right)\\
\mathbf{else}:\\
\;\;\;\;3 \cdot x\\
\end{array}
\end{array}
if x < -5.4999999999999996e139 or 1.54999999999999999e91 < x Initial program 99.7%
Taylor expanded in x around inf
lower-*.f6473.6
Applied rewrites73.6%
if -5.4999999999999996e139 < x < 1.54999999999999999e91Initial program 100.0%
Taylor expanded in z around 0
associate-+r+N/A
distribute-rgt1-inN/A
metadata-evalN/A
lower-fma.f64N/A
lower-*.f6452.3
Applied rewrites52.3%
Taylor expanded in x around 0
Applied rewrites39.8%
Taylor expanded in x around 0
+-commutativeN/A
lower-fma.f6487.5
Applied rewrites87.5%
(FPCore (x y z) :precision binary64 (if (<= x -5.5e+139) (* 3.0 x) (if (<= x 1.55e+91) (+ (+ z y) y) (* 3.0 x))))
double code(double x, double y, double z) {
double tmp;
if (x <= -5.5e+139) {
tmp = 3.0 * x;
} else if (x <= 1.55e+91) {
tmp = (z + y) + y;
} else {
tmp = 3.0 * x;
}
return tmp;
}
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 <= (-5.5d+139)) then
tmp = 3.0d0 * x
else if (x <= 1.55d+91) then
tmp = (z + y) + y
else
tmp = 3.0d0 * x
end if
code = tmp
end function
public static double code(double x, double y, double z) {
double tmp;
if (x <= -5.5e+139) {
tmp = 3.0 * x;
} else if (x <= 1.55e+91) {
tmp = (z + y) + y;
} else {
tmp = 3.0 * x;
}
return tmp;
}
def code(x, y, z): tmp = 0 if x <= -5.5e+139: tmp = 3.0 * x elif x <= 1.55e+91: tmp = (z + y) + y else: tmp = 3.0 * x return tmp
function code(x, y, z) tmp = 0.0 if (x <= -5.5e+139) tmp = Float64(3.0 * x); elseif (x <= 1.55e+91) tmp = Float64(Float64(z + y) + y); else tmp = Float64(3.0 * x); end return tmp end
function tmp_2 = code(x, y, z) tmp = 0.0; if (x <= -5.5e+139) tmp = 3.0 * x; elseif (x <= 1.55e+91) tmp = (z + y) + y; else tmp = 3.0 * x; end tmp_2 = tmp; end
code[x_, y_, z_] := If[LessEqual[x, -5.5e+139], N[(3.0 * x), $MachinePrecision], If[LessEqual[x, 1.55e+91], N[(N[(z + y), $MachinePrecision] + y), $MachinePrecision], N[(3.0 * x), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;x \leq -5.5 \cdot 10^{+139}:\\
\;\;\;\;3 \cdot x\\
\mathbf{elif}\;x \leq 1.55 \cdot 10^{+91}:\\
\;\;\;\;\left(z + y\right) + y\\
\mathbf{else}:\\
\;\;\;\;3 \cdot x\\
\end{array}
\end{array}
if x < -5.4999999999999996e139 or 1.54999999999999999e91 < x Initial program 99.7%
Taylor expanded in x around inf
lower-*.f6473.6
Applied rewrites73.6%
if -5.4999999999999996e139 < x < 1.54999999999999999e91Initial program 100.0%
Taylor expanded in z around 0
associate-+r+N/A
distribute-rgt1-inN/A
metadata-evalN/A
lower-fma.f64N/A
lower-*.f6452.3
Applied rewrites52.3%
Taylor expanded in x around 0
Applied rewrites39.8%
Taylor expanded in x around 0
+-commutativeN/A
lower-fma.f6487.5
Applied rewrites87.5%
Applied rewrites87.5%
(FPCore (x y z) :precision binary64 (if (<= y -7.4e+56) (+ y y) (if (<= y 3.2e+57) (* 3.0 x) (+ y y))))
double code(double x, double y, double z) {
double tmp;
if (y <= -7.4e+56) {
tmp = y + y;
} else if (y <= 3.2e+57) {
tmp = 3.0 * x;
} else {
tmp = y + y;
}
return tmp;
}
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 (y <= (-7.4d+56)) then
tmp = y + y
else if (y <= 3.2d+57) then
tmp = 3.0d0 * x
else
tmp = y + y
end if
code = tmp
end function
public static double code(double x, double y, double z) {
double tmp;
if (y <= -7.4e+56) {
tmp = y + y;
} else if (y <= 3.2e+57) {
tmp = 3.0 * x;
} else {
tmp = y + y;
}
return tmp;
}
def code(x, y, z): tmp = 0 if y <= -7.4e+56: tmp = y + y elif y <= 3.2e+57: tmp = 3.0 * x else: tmp = y + y return tmp
function code(x, y, z) tmp = 0.0 if (y <= -7.4e+56) tmp = Float64(y + y); elseif (y <= 3.2e+57) tmp = Float64(3.0 * x); else tmp = Float64(y + y); end return tmp end
function tmp_2 = code(x, y, z) tmp = 0.0; if (y <= -7.4e+56) tmp = y + y; elseif (y <= 3.2e+57) tmp = 3.0 * x; else tmp = y + y; end tmp_2 = tmp; end
code[x_, y_, z_] := If[LessEqual[y, -7.4e+56], N[(y + y), $MachinePrecision], If[LessEqual[y, 3.2e+57], N[(3.0 * x), $MachinePrecision], N[(y + y), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;y \leq -7.4 \cdot 10^{+56}:\\
\;\;\;\;y + y\\
\mathbf{elif}\;y \leq 3.2 \cdot 10^{+57}:\\
\;\;\;\;3 \cdot x\\
\mathbf{else}:\\
\;\;\;\;y + y\\
\end{array}
\end{array}
if y < -7.39999999999999994e56 or 3.20000000000000029e57 < y Initial program 99.9%
Taylor expanded in z around 0
associate-+r+N/A
distribute-rgt1-inN/A
metadata-evalN/A
lower-fma.f64N/A
lower-*.f6485.0
Applied rewrites85.0%
Taylor expanded in x around 0
Applied rewrites71.6%
Applied rewrites71.6%
if -7.39999999999999994e56 < y < 3.20000000000000029e57Initial program 99.9%
Taylor expanded in x around inf
lower-*.f6444.2
Applied rewrites44.2%
(FPCore (x y z) :precision binary64 (+ (+ (+ (+ y x) z) (+ y x)) x))
double code(double x, double y, double z) {
return (((y + x) + z) + (y + x)) + x;
}
real(8) function code(x, y, z)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
code = (((y + x) + z) + (y + x)) + x
end function
public static double code(double x, double y, double z) {
return (((y + x) + z) + (y + x)) + x;
}
def code(x, y, z): return (((y + x) + z) + (y + x)) + x
function code(x, y, z) return Float64(Float64(Float64(Float64(y + x) + z) + Float64(y + x)) + x) end
function tmp = code(x, y, z) tmp = (((y + x) + z) + (y + x)) + x; end
code[x_, y_, z_] := N[(N[(N[(N[(y + x), $MachinePrecision] + z), $MachinePrecision] + N[(y + x), $MachinePrecision]), $MachinePrecision] + x), $MachinePrecision]
\begin{array}{l}
\\
\left(\left(\left(y + x\right) + z\right) + \left(y + x\right)\right) + x
\end{array}
Initial program 99.9%
lift-+.f64N/A
+-commutativeN/A
lift-+.f64N/A
lift-+.f64N/A
associate-+l+N/A
+-commutativeN/A
lift-+.f64N/A
associate-+r+N/A
lower-+.f64N/A
lower-+.f6499.9
lift-+.f64N/A
+-commutativeN/A
lower-+.f6499.9
lift-+.f64N/A
+-commutativeN/A
lower-+.f6499.9
Applied rewrites99.9%
Final simplification99.9%
(FPCore (x y z) :precision binary64 (+ y y))
double code(double x, double y, double z) {
return y + y;
}
real(8) function code(x, y, z)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
code = y + y
end function
public static double code(double x, double y, double z) {
return y + y;
}
def code(x, y, z): return y + y
function code(x, y, z) return Float64(y + y) end
function tmp = code(x, y, z) tmp = y + y; end
code[x_, y_, z_] := N[(y + y), $MachinePrecision]
\begin{array}{l}
\\
y + y
\end{array}
Initial program 99.9%
Taylor expanded in z around 0
associate-+r+N/A
distribute-rgt1-inN/A
metadata-evalN/A
lower-fma.f64N/A
lower-*.f6463.6
Applied rewrites63.6%
Taylor expanded in x around 0
Applied rewrites32.3%
Applied rewrites32.3%
herbie shell --seed 2024296
(FPCore (x y z)
:name "Graphics.Rendering.Plot.Render.Plot.Legend:renderLegendInside from plot-0.2.3.4"
:precision binary64
(+ (+ (+ (+ (+ x y) y) x) z) x))