
(FPCore (x y z) :precision binary64 (+ (* x (sin y)) (* z (cos y))))
double code(double x, double y, double z) {
return (x * sin(y)) + (z * cos(y));
}
real(8) function code(x, y, z)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
code = (x * sin(y)) + (z * cos(y))
end function
public static double code(double x, double y, double z) {
return (x * Math.sin(y)) + (z * Math.cos(y));
}
def code(x, y, z): return (x * math.sin(y)) + (z * math.cos(y))
function code(x, y, z) return Float64(Float64(x * sin(y)) + Float64(z * cos(y))) end
function tmp = code(x, y, z) tmp = (x * sin(y)) + (z * cos(y)); end
code[x_, y_, z_] := N[(N[(x * N[Sin[y], $MachinePrecision]), $MachinePrecision] + N[(z * N[Cos[y], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
x \cdot \sin y + z \cdot \cos y
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 8 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (x y z) :precision binary64 (+ (* x (sin y)) (* z (cos y))))
double code(double x, double y, double z) {
return (x * sin(y)) + (z * cos(y));
}
real(8) function code(x, y, z)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
code = (x * sin(y)) + (z * cos(y))
end function
public static double code(double x, double y, double z) {
return (x * Math.sin(y)) + (z * Math.cos(y));
}
def code(x, y, z): return (x * math.sin(y)) + (z * math.cos(y))
function code(x, y, z) return Float64(Float64(x * sin(y)) + Float64(z * cos(y))) end
function tmp = code(x, y, z) tmp = (x * sin(y)) + (z * cos(y)); end
code[x_, y_, z_] := N[(N[(x * N[Sin[y], $MachinePrecision]), $MachinePrecision] + N[(z * N[Cos[y], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
x \cdot \sin y + z \cdot \cos y
\end{array}
(FPCore (x y z) :precision binary64 (fma (sin y) x (* z (cos y))))
double code(double x, double y, double z) {
return fma(sin(y), x, (z * cos(y)));
}
function code(x, y, z) return fma(sin(y), x, Float64(z * cos(y))) end
code[x_, y_, z_] := N[(N[Sin[y], $MachinePrecision] * x + N[(z * N[Cos[y], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
\mathsf{fma}\left(\sin y, x, z \cdot \cos y\right)
\end{array}
Initial program 99.8%
*-commutativeN/A
fma-defineN/A
fma-lowering-fma.f64N/A
sin-lowering-sin.f64N/A
*-lowering-*.f64N/A
cos-lowering-cos.f6499.8%
Applied egg-rr99.8%
(FPCore (x y z) :precision binary64 (+ (* z (cos y)) (* (sin y) x)))
double code(double x, double y, double z) {
return (z * cos(y)) + (sin(y) * 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 * cos(y)) + (sin(y) * x)
end function
public static double code(double x, double y, double z) {
return (z * Math.cos(y)) + (Math.sin(y) * x);
}
def code(x, y, z): return (z * math.cos(y)) + (math.sin(y) * x)
function code(x, y, z) return Float64(Float64(z * cos(y)) + Float64(sin(y) * x)) end
function tmp = code(x, y, z) tmp = (z * cos(y)) + (sin(y) * x); end
code[x_, y_, z_] := N[(N[(z * N[Cos[y], $MachinePrecision]), $MachinePrecision] + N[(N[Sin[y], $MachinePrecision] * x), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
z \cdot \cos y + \sin y \cdot x
\end{array}
Initial program 99.8%
Final simplification99.8%
(FPCore (x y z)
:precision binary64
(let* ((t_0 (* z (cos y))))
(if (<= z -4.5e+31)
t_0
(if (<= z -4.2e-172)
(+ z (* y x))
(if (<= z 1.95e-123) (* (sin y) x) t_0)))))
double code(double x, double y, double z) {
double t_0 = z * cos(y);
double tmp;
if (z <= -4.5e+31) {
tmp = t_0;
} else if (z <= -4.2e-172) {
tmp = z + (y * x);
} else if (z <= 1.95e-123) {
tmp = sin(y) * x;
} else {
tmp = t_0;
}
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) :: t_0
real(8) :: tmp
t_0 = z * cos(y)
if (z <= (-4.5d+31)) then
tmp = t_0
else if (z <= (-4.2d-172)) then
tmp = z + (y * x)
else if (z <= 1.95d-123) then
tmp = sin(y) * x
else
tmp = t_0
end if
code = tmp
end function
public static double code(double x, double y, double z) {
double t_0 = z * Math.cos(y);
double tmp;
if (z <= -4.5e+31) {
tmp = t_0;
} else if (z <= -4.2e-172) {
tmp = z + (y * x);
} else if (z <= 1.95e-123) {
tmp = Math.sin(y) * x;
} else {
tmp = t_0;
}
return tmp;
}
def code(x, y, z): t_0 = z * math.cos(y) tmp = 0 if z <= -4.5e+31: tmp = t_0 elif z <= -4.2e-172: tmp = z + (y * x) elif z <= 1.95e-123: tmp = math.sin(y) * x else: tmp = t_0 return tmp
function code(x, y, z) t_0 = Float64(z * cos(y)) tmp = 0.0 if (z <= -4.5e+31) tmp = t_0; elseif (z <= -4.2e-172) tmp = Float64(z + Float64(y * x)); elseif (z <= 1.95e-123) tmp = Float64(sin(y) * x); else tmp = t_0; end return tmp end
function tmp_2 = code(x, y, z) t_0 = z * cos(y); tmp = 0.0; if (z <= -4.5e+31) tmp = t_0; elseif (z <= -4.2e-172) tmp = z + (y * x); elseif (z <= 1.95e-123) tmp = sin(y) * x; else tmp = t_0; end tmp_2 = tmp; end
code[x_, y_, z_] := Block[{t$95$0 = N[(z * N[Cos[y], $MachinePrecision]), $MachinePrecision]}, If[LessEqual[z, -4.5e+31], t$95$0, If[LessEqual[z, -4.2e-172], N[(z + N[(y * x), $MachinePrecision]), $MachinePrecision], If[LessEqual[z, 1.95e-123], N[(N[Sin[y], $MachinePrecision] * x), $MachinePrecision], t$95$0]]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := z \cdot \cos y\\
\mathbf{if}\;z \leq -4.5 \cdot 10^{+31}:\\
\;\;\;\;t\_0\\
\mathbf{elif}\;z \leq -4.2 \cdot 10^{-172}:\\
\;\;\;\;z + y \cdot x\\
\mathbf{elif}\;z \leq 1.95 \cdot 10^{-123}:\\
\;\;\;\;\sin y \cdot x\\
\mathbf{else}:\\
\;\;\;\;t\_0\\
\end{array}
\end{array}
if z < -4.4999999999999996e31 or 1.94999999999999988e-123 < z Initial program 99.8%
Taylor expanded in x around 0
*-lowering-*.f64N/A
cos-lowering-cos.f6483.5%
Simplified83.5%
if -4.4999999999999996e31 < z < -4.1999999999999999e-172Initial program 99.8%
Taylor expanded in y around 0
+-lowering-+.f64N/A
*-commutativeN/A
*-lowering-*.f6471.8%
Simplified71.8%
if -4.1999999999999999e-172 < z < 1.94999999999999988e-123Initial program 99.8%
Taylor expanded in x around inf
*-lowering-*.f64N/A
sin-lowering-sin.f6480.6%
Simplified80.6%
Final simplification81.0%
(FPCore (x y z) :precision binary64 (let* ((t_0 (* z (cos y)))) (if (<= z -2.7e+36) t_0 (if (<= z 4.3e+112) (+ z (* (sin y) x)) t_0))))
double code(double x, double y, double z) {
double t_0 = z * cos(y);
double tmp;
if (z <= -2.7e+36) {
tmp = t_0;
} else if (z <= 4.3e+112) {
tmp = z + (sin(y) * x);
} else {
tmp = t_0;
}
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) :: t_0
real(8) :: tmp
t_0 = z * cos(y)
if (z <= (-2.7d+36)) then
tmp = t_0
else if (z <= 4.3d+112) then
tmp = z + (sin(y) * x)
else
tmp = t_0
end if
code = tmp
end function
public static double code(double x, double y, double z) {
double t_0 = z * Math.cos(y);
double tmp;
if (z <= -2.7e+36) {
tmp = t_0;
} else if (z <= 4.3e+112) {
tmp = z + (Math.sin(y) * x);
} else {
tmp = t_0;
}
return tmp;
}
def code(x, y, z): t_0 = z * math.cos(y) tmp = 0 if z <= -2.7e+36: tmp = t_0 elif z <= 4.3e+112: tmp = z + (math.sin(y) * x) else: tmp = t_0 return tmp
function code(x, y, z) t_0 = Float64(z * cos(y)) tmp = 0.0 if (z <= -2.7e+36) tmp = t_0; elseif (z <= 4.3e+112) tmp = Float64(z + Float64(sin(y) * x)); else tmp = t_0; end return tmp end
function tmp_2 = code(x, y, z) t_0 = z * cos(y); tmp = 0.0; if (z <= -2.7e+36) tmp = t_0; elseif (z <= 4.3e+112) tmp = z + (sin(y) * x); else tmp = t_0; end tmp_2 = tmp; end
code[x_, y_, z_] := Block[{t$95$0 = N[(z * N[Cos[y], $MachinePrecision]), $MachinePrecision]}, If[LessEqual[z, -2.7e+36], t$95$0, If[LessEqual[z, 4.3e+112], N[(z + N[(N[Sin[y], $MachinePrecision] * x), $MachinePrecision]), $MachinePrecision], t$95$0]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := z \cdot \cos y\\
\mathbf{if}\;z \leq -2.7 \cdot 10^{+36}:\\
\;\;\;\;t\_0\\
\mathbf{elif}\;z \leq 4.3 \cdot 10^{+112}:\\
\;\;\;\;z + \sin y \cdot x\\
\mathbf{else}:\\
\;\;\;\;t\_0\\
\end{array}
\end{array}
if z < -2.7000000000000001e36 or 4.29999999999999983e112 < z Initial program 99.8%
Taylor expanded in x around 0
*-lowering-*.f64N/A
cos-lowering-cos.f6489.7%
Simplified89.7%
if -2.7000000000000001e36 < z < 4.29999999999999983e112Initial program 99.8%
Taylor expanded in y around 0
Simplified90.3%
Final simplification90.0%
(FPCore (x y z)
:precision binary64
(let* ((t_0 (* (sin y) x)))
(if (<= y -3.55e+21)
t_0
(if (<= y 2.5e+16)
(+ z (* y (+ x (* y (* (* y x) -0.16666666666666666)))))
t_0))))
double code(double x, double y, double z) {
double t_0 = sin(y) * x;
double tmp;
if (y <= -3.55e+21) {
tmp = t_0;
} else if (y <= 2.5e+16) {
tmp = z + (y * (x + (y * ((y * x) * -0.16666666666666666))));
} else {
tmp = t_0;
}
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) :: t_0
real(8) :: tmp
t_0 = sin(y) * x
if (y <= (-3.55d+21)) then
tmp = t_0
else if (y <= 2.5d+16) then
tmp = z + (y * (x + (y * ((y * x) * (-0.16666666666666666d0)))))
else
tmp = t_0
end if
code = tmp
end function
public static double code(double x, double y, double z) {
double t_0 = Math.sin(y) * x;
double tmp;
if (y <= -3.55e+21) {
tmp = t_0;
} else if (y <= 2.5e+16) {
tmp = z + (y * (x + (y * ((y * x) * -0.16666666666666666))));
} else {
tmp = t_0;
}
return tmp;
}
def code(x, y, z): t_0 = math.sin(y) * x tmp = 0 if y <= -3.55e+21: tmp = t_0 elif y <= 2.5e+16: tmp = z + (y * (x + (y * ((y * x) * -0.16666666666666666)))) else: tmp = t_0 return tmp
function code(x, y, z) t_0 = Float64(sin(y) * x) tmp = 0.0 if (y <= -3.55e+21) tmp = t_0; elseif (y <= 2.5e+16) tmp = Float64(z + Float64(y * Float64(x + Float64(y * Float64(Float64(y * x) * -0.16666666666666666))))); else tmp = t_0; end return tmp end
function tmp_2 = code(x, y, z) t_0 = sin(y) * x; tmp = 0.0; if (y <= -3.55e+21) tmp = t_0; elseif (y <= 2.5e+16) tmp = z + (y * (x + (y * ((y * x) * -0.16666666666666666)))); else tmp = t_0; end tmp_2 = tmp; end
code[x_, y_, z_] := Block[{t$95$0 = N[(N[Sin[y], $MachinePrecision] * x), $MachinePrecision]}, If[LessEqual[y, -3.55e+21], t$95$0, If[LessEqual[y, 2.5e+16], N[(z + N[(y * N[(x + N[(y * N[(N[(y * x), $MachinePrecision] * -0.16666666666666666), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], t$95$0]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := \sin y \cdot x\\
\mathbf{if}\;y \leq -3.55 \cdot 10^{+21}:\\
\;\;\;\;t\_0\\
\mathbf{elif}\;y \leq 2.5 \cdot 10^{+16}:\\
\;\;\;\;z + y \cdot \left(x + y \cdot \left(\left(y \cdot x\right) \cdot -0.16666666666666666\right)\right)\\
\mathbf{else}:\\
\;\;\;\;t\_0\\
\end{array}
\end{array}
if y < -3.55e21 or 2.5e16 < y Initial program 99.7%
Taylor expanded in x around inf
*-lowering-*.f64N/A
sin-lowering-sin.f6450.0%
Simplified50.0%
if -3.55e21 < y < 2.5e16Initial program 100.0%
Taylor expanded in y around 0
+-lowering-+.f64N/A
*-lowering-*.f64N/A
+-lowering-+.f64N/A
*-lowering-*.f64N/A
+-lowering-+.f64N/A
*-commutativeN/A
*-lowering-*.f64N/A
*-commutativeN/A
*-lowering-*.f64N/A
*-commutativeN/A
*-lowering-*.f6495.1%
Simplified95.1%
Taylor expanded in z around 0
*-commutativeN/A
*-lowering-*.f64N/A
*-lowering-*.f6495.8%
Simplified95.8%
Final simplification74.3%
(FPCore (x y z) :precision binary64 (if (<= z -7.2e-160) z (if (<= z 2.5e-214) (* y x) z)))
double code(double x, double y, double z) {
double tmp;
if (z <= -7.2e-160) {
tmp = z;
} else if (z <= 2.5e-214) {
tmp = y * x;
} else {
tmp = 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
real(8) :: tmp
if (z <= (-7.2d-160)) then
tmp = z
else if (z <= 2.5d-214) then
tmp = y * x
else
tmp = z
end if
code = tmp
end function
public static double code(double x, double y, double z) {
double tmp;
if (z <= -7.2e-160) {
tmp = z;
} else if (z <= 2.5e-214) {
tmp = y * x;
} else {
tmp = z;
}
return tmp;
}
def code(x, y, z): tmp = 0 if z <= -7.2e-160: tmp = z elif z <= 2.5e-214: tmp = y * x else: tmp = z return tmp
function code(x, y, z) tmp = 0.0 if (z <= -7.2e-160) tmp = z; elseif (z <= 2.5e-214) tmp = Float64(y * x); else tmp = z; end return tmp end
function tmp_2 = code(x, y, z) tmp = 0.0; if (z <= -7.2e-160) tmp = z; elseif (z <= 2.5e-214) tmp = y * x; else tmp = z; end tmp_2 = tmp; end
code[x_, y_, z_] := If[LessEqual[z, -7.2e-160], z, If[LessEqual[z, 2.5e-214], N[(y * x), $MachinePrecision], z]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;z \leq -7.2 \cdot 10^{-160}:\\
\;\;\;\;z\\
\mathbf{elif}\;z \leq 2.5 \cdot 10^{-214}:\\
\;\;\;\;y \cdot x\\
\mathbf{else}:\\
\;\;\;\;z\\
\end{array}
\end{array}
if z < -7.1999999999999994e-160 or 2.4999999999999999e-214 < z Initial program 99.8%
Taylor expanded in y around 0
Simplified48.7%
if -7.1999999999999994e-160 < z < 2.4999999999999999e-214Initial program 99.8%
Taylor expanded in x around inf
*-lowering-*.f64N/A
sin-lowering-sin.f6484.3%
Simplified84.3%
Taylor expanded in y around 0
Simplified37.1%
Final simplification46.4%
(FPCore (x y z) :precision binary64 (+ z (* y x)))
double code(double x, double y, double z) {
return z + (y * 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)
end function
public static double code(double x, double y, double z) {
return z + (y * x);
}
def code(x, y, z): return z + (y * x)
function code(x, y, z) return Float64(z + Float64(y * x)) end
function tmp = code(x, y, z) tmp = z + (y * x); end
code[x_, y_, z_] := N[(z + N[(y * x), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
z + y \cdot x
\end{array}
Initial program 99.8%
Taylor expanded in y around 0
+-lowering-+.f64N/A
*-commutativeN/A
*-lowering-*.f6453.7%
Simplified53.7%
(FPCore (x y z) :precision binary64 z)
double code(double x, double y, double z) {
return z;
}
real(8) function code(x, y, z)
real(8), intent (in) :: x
real(8), intent (in) :: y
real(8), intent (in) :: z
code = z
end function
public static double code(double x, double y, double z) {
return z;
}
def code(x, y, z): return z
function code(x, y, z) return z end
function tmp = code(x, y, z) tmp = z; end
code[x_, y_, z_] := z
\begin{array}{l}
\\
z
\end{array}
Initial program 99.8%
Taylor expanded in y around 0
Simplified41.8%
herbie shell --seed 2024160
(FPCore (x y z)
:name "Diagrams.ThreeD.Transform:aboutX from diagrams-lib-1.3.0.3, B"
:precision binary64
(+ (* x (sin y)) (* z (cos y))))