
(FPCore (z0 z1 z2) :precision binary64 (cos (* (atan (* (tan (- (* z0 (+ PI PI)) (* -1/2 PI))) (/ z1 z2))) -2)))
double code(double z0, double z1, double z2) {
return cos((atan((tan(((z0 * (((double) M_PI) + ((double) M_PI))) - (-0.5 * ((double) M_PI)))) * (z1 / z2))) * -2.0));
}
public static double code(double z0, double z1, double z2) {
return Math.cos((Math.atan((Math.tan(((z0 * (Math.PI + Math.PI)) - (-0.5 * Math.PI))) * (z1 / z2))) * -2.0));
}
def code(z0, z1, z2): return math.cos((math.atan((math.tan(((z0 * (math.pi + math.pi)) - (-0.5 * math.pi))) * (z1 / z2))) * -2.0))
function code(z0, z1, z2) return cos(Float64(atan(Float64(tan(Float64(Float64(z0 * Float64(pi + pi)) - Float64(-0.5 * pi))) * Float64(z1 / z2))) * -2.0)) end
function tmp = code(z0, z1, z2) tmp = cos((atan((tan(((z0 * (pi + pi)) - (-0.5 * pi))) * (z1 / z2))) * -2.0)); end
code[z0_, z1_, z2_] := N[Cos[N[(N[ArcTan[N[(N[Tan[N[(N[(z0 * N[(Pi + Pi), $MachinePrecision]), $MachinePrecision] - N[(-1/2 * Pi), $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * N[(z1 / z2), $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * -2), $MachinePrecision]], $MachinePrecision]
\cos \left(\tan^{-1} \left(\tan \left(z0 \cdot \left(\pi + \pi\right) - \frac{-1}{2} \cdot \pi\right) \cdot \frac{z1}{z2}\right) \cdot -2\right)
Herbie found 2 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (z0 z1 z2) :precision binary64 (cos (* (atan (* (tan (- (* z0 (+ PI PI)) (* -1/2 PI))) (/ z1 z2))) -2)))
double code(double z0, double z1, double z2) {
return cos((atan((tan(((z0 * (((double) M_PI) + ((double) M_PI))) - (-0.5 * ((double) M_PI)))) * (z1 / z2))) * -2.0));
}
public static double code(double z0, double z1, double z2) {
return Math.cos((Math.atan((Math.tan(((z0 * (Math.PI + Math.PI)) - (-0.5 * Math.PI))) * (z1 / z2))) * -2.0));
}
def code(z0, z1, z2): return math.cos((math.atan((math.tan(((z0 * (math.pi + math.pi)) - (-0.5 * math.pi))) * (z1 / z2))) * -2.0))
function code(z0, z1, z2) return cos(Float64(atan(Float64(tan(Float64(Float64(z0 * Float64(pi + pi)) - Float64(-0.5 * pi))) * Float64(z1 / z2))) * -2.0)) end
function tmp = code(z0, z1, z2) tmp = cos((atan((tan(((z0 * (pi + pi)) - (-0.5 * pi))) * (z1 / z2))) * -2.0)); end
code[z0_, z1_, z2_] := N[Cos[N[(N[ArcTan[N[(N[Tan[N[(N[(z0 * N[(Pi + Pi), $MachinePrecision]), $MachinePrecision] - N[(-1/2 * Pi), $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * N[(z1 / z2), $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * -2), $MachinePrecision]], $MachinePrecision]
\cos \left(\tan^{-1} \left(\tan \left(z0 \cdot \left(\pi + \pi\right) - \frac{-1}{2} \cdot \pi\right) \cdot \frac{z1}{z2}\right) \cdot -2\right)
(FPCore (z0 z1 z2) :precision binary64 (let* ((t_0 (* (+ PI PI) z0))) (cos (* (atan (/ (* (cos t_0) z1) (* (- (sin t_0)) z2))) -2))))
double code(double z0, double z1, double z2) {
double t_0 = (((double) M_PI) + ((double) M_PI)) * z0;
return cos((atan(((cos(t_0) * z1) / (-sin(t_0) * z2))) * -2.0));
}
public static double code(double z0, double z1, double z2) {
double t_0 = (Math.PI + Math.PI) * z0;
return Math.cos((Math.atan(((Math.cos(t_0) * z1) / (-Math.sin(t_0) * z2))) * -2.0));
}
def code(z0, z1, z2): t_0 = (math.pi + math.pi) * z0 return math.cos((math.atan(((math.cos(t_0) * z1) / (-math.sin(t_0) * z2))) * -2.0))
function code(z0, z1, z2) t_0 = Float64(Float64(pi + pi) * z0) return cos(Float64(atan(Float64(Float64(cos(t_0) * z1) / Float64(Float64(-sin(t_0)) * z2))) * -2.0)) end
function tmp = code(z0, z1, z2) t_0 = (pi + pi) * z0; tmp = cos((atan(((cos(t_0) * z1) / (-sin(t_0) * z2))) * -2.0)); end
code[z0_, z1_, z2_] := Block[{t$95$0 = N[(N[(Pi + Pi), $MachinePrecision] * z0), $MachinePrecision]}, N[Cos[N[(N[ArcTan[N[(N[(N[Cos[t$95$0], $MachinePrecision] * z1), $MachinePrecision] / N[((-N[Sin[t$95$0], $MachinePrecision]) * z2), $MachinePrecision]), $MachinePrecision]], $MachinePrecision] * -2), $MachinePrecision]], $MachinePrecision]]
\begin{array}{l}
t_0 := \left(\pi + \pi\right) \cdot z0\\
\cos \left(\tan^{-1} \left(\frac{\cos t\_0 \cdot z1}{\left(-\sin t\_0\right) \cdot z2}\right) \cdot -2\right)
\end{array}
Initial program 82.3%
lift-*.f64N/A
lift-tan.f64N/A
tan-quotN/A
lift-/.f64N/A
frac-timesN/A
lower-/.f64N/A
Applied rewrites99.9%
(FPCore (z0 z1 z2) :precision binary64 (cos (* (atan (/ (* z1 (tan (* PI (+ 1/2 (+ z0 z0))))) z2)) -2)))
double code(double z0, double z1, double z2) {
return cos((atan(((z1 * tan((((double) M_PI) * (0.5 + (z0 + z0))))) / z2)) * -2.0));
}
public static double code(double z0, double z1, double z2) {
return Math.cos((Math.atan(((z1 * Math.tan((Math.PI * (0.5 + (z0 + z0))))) / z2)) * -2.0));
}
def code(z0, z1, z2): return math.cos((math.atan(((z1 * math.tan((math.pi * (0.5 + (z0 + z0))))) / z2)) * -2.0))
function code(z0, z1, z2) return cos(Float64(atan(Float64(Float64(z1 * tan(Float64(pi * Float64(0.5 + Float64(z0 + z0))))) / z2)) * -2.0)) end
function tmp = code(z0, z1, z2) tmp = cos((atan(((z1 * tan((pi * (0.5 + (z0 + z0))))) / z2)) * -2.0)); end
code[z0_, z1_, z2_] := N[Cos[N[(N[ArcTan[N[(N[(z1 * N[Tan[N[(Pi * N[(1/2 + N[(z0 + z0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision] / z2), $MachinePrecision]], $MachinePrecision] * -2), $MachinePrecision]], $MachinePrecision]
\cos \left(\tan^{-1} \left(\frac{z1 \cdot \tan \left(\pi \cdot \left(\frac{1}{2} + \left(z0 + z0\right)\right)\right)}{z2}\right) \cdot -2\right)
Initial program 82.3%
lift-*.f64N/A
lift-/.f64N/A
associate-*r/N/A
lower-/.f64N/A
Applied rewrites82.3%
herbie shell --seed 2025277 -o generate:taylor -o generate:evaluate
(FPCore (z0 z1 z2)
:name "(cos (* (atan (* (tan (- (* z0 (+ PI PI)) (* -1/2 PI))) (/ z1 z2))) -2))"
:precision binary64
(cos (* (atan (* (tan (- (* z0 (+ PI PI)) (* -1/2 PI))) (/ z1 z2))) -2)))