
(FPCore (z0 z1 z2) :precision binary64 (atan (* (tan (- (* z0 (+ PI PI)) (* -1/2 PI))) (/ z1 z2))))
double code(double z0, double z1, double z2) {
return atan((tan(((z0 * (((double) M_PI) + ((double) M_PI))) - (-0.5 * ((double) M_PI)))) * (z1 / z2)));
}
public static double code(double z0, double z1, double z2) {
return Math.atan((Math.tan(((z0 * (Math.PI + Math.PI)) - (-0.5 * Math.PI))) * (z1 / z2)));
}
def code(z0, z1, z2): return math.atan((math.tan(((z0 * (math.pi + math.pi)) - (-0.5 * math.pi))) * (z1 / z2)))
function code(z0, z1, z2) return atan(Float64(tan(Float64(Float64(z0 * Float64(pi + pi)) - Float64(-0.5 * pi))) * Float64(z1 / z2))) end
function tmp = code(z0, z1, z2) tmp = atan((tan(((z0 * (pi + pi)) - (-0.5 * pi))) * (z1 / z2))); end
code[z0_, z1_, z2_] := 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]
\tan^{-1} \left(\tan \left(z0 \cdot \left(\pi + \pi\right) - \frac{-1}{2} \cdot \pi\right) \cdot \frac{z1}{z2}\right)
Herbie found 2 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (z0 z1 z2) :precision binary64 (atan (* (tan (- (* z0 (+ PI PI)) (* -1/2 PI))) (/ z1 z2))))
double code(double z0, double z1, double z2) {
return atan((tan(((z0 * (((double) M_PI) + ((double) M_PI))) - (-0.5 * ((double) M_PI)))) * (z1 / z2)));
}
public static double code(double z0, double z1, double z2) {
return Math.atan((Math.tan(((z0 * (Math.PI + Math.PI)) - (-0.5 * Math.PI))) * (z1 / z2)));
}
def code(z0, z1, z2): return math.atan((math.tan(((z0 * (math.pi + math.pi)) - (-0.5 * math.pi))) * (z1 / z2)))
function code(z0, z1, z2) return atan(Float64(tan(Float64(Float64(z0 * Float64(pi + pi)) - Float64(-0.5 * pi))) * Float64(z1 / z2))) end
function tmp = code(z0, z1, z2) tmp = atan((tan(((z0 * (pi + pi)) - (-0.5 * pi))) * (z1 / z2))); end
code[z0_, z1_, z2_] := 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]
\tan^{-1} \left(\tan \left(z0 \cdot \left(\pi + \pi\right) - \frac{-1}{2} \cdot \pi\right) \cdot \frac{z1}{z2}\right)
(FPCore (z0 z1 z2) :precision binary64 (atan (* (/ 1 z2) (/ z1 (tan (* (- (* -2 z0) 0) PI))))))
double code(double z0, double z1, double z2) {
return atan(((1.0 / z2) * (z1 / tan((((-2.0 * z0) - 0.0) * ((double) M_PI))))));
}
public static double code(double z0, double z1, double z2) {
return Math.atan(((1.0 / z2) * (z1 / Math.tan((((-2.0 * z0) - 0.0) * Math.PI)))));
}
def code(z0, z1, z2): return math.atan(((1.0 / z2) * (z1 / math.tan((((-2.0 * z0) - 0.0) * math.pi)))))
function code(z0, z1, z2) return atan(Float64(Float64(1.0 / z2) * Float64(z1 / tan(Float64(Float64(Float64(-2.0 * z0) - 0.0) * pi))))) end
function tmp = code(z0, z1, z2) tmp = atan(((1.0 / z2) * (z1 / tan((((-2.0 * z0) - 0.0) * pi))))); end
code[z0_, z1_, z2_] := N[ArcTan[N[(N[(1 / z2), $MachinePrecision] * N[(z1 / N[Tan[N[(N[(N[(-2 * z0), $MachinePrecision] - 0), $MachinePrecision] * Pi), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]
\tan^{-1} \left(\frac{1}{z2} \cdot \frac{z1}{\tan \left(\left(-2 \cdot z0 - 0\right) \cdot \pi\right)}\right)
Initial program 37.0%
lift-*.f64N/A
lift-/.f64N/A
associate-*r/N/A
mult-flipN/A
*-commutativeN/A
lower-*.f64N/A
lower-/.f64N/A
*-commutativeN/A
lower-*.f6437.1%
lift--.f64N/A
lift-*.f64N/A
fp-cancel-sub-sign-invN/A
+-commutativeN/A
lift-*.f64N/A
lift-+.f64N/A
count-2N/A
Applied rewrites37.0%
Applied rewrites36.8%
Applied rewrites99.0%
(FPCore (z0 z1 z2) :precision binary64 (atan (/ z1 (* (tan (* (* PI z0) -2)) z2))))
double code(double z0, double z1, double z2) {
return atan((z1 / (tan(((((double) M_PI) * z0) * -2.0)) * z2)));
}
public static double code(double z0, double z1, double z2) {
return Math.atan((z1 / (Math.tan(((Math.PI * z0) * -2.0)) * z2)));
}
def code(z0, z1, z2): return math.atan((z1 / (math.tan(((math.pi * z0) * -2.0)) * z2)))
function code(z0, z1, z2) return atan(Float64(z1 / Float64(tan(Float64(Float64(pi * z0) * -2.0)) * z2))) end
function tmp = code(z0, z1, z2) tmp = atan((z1 / (tan(((pi * z0) * -2.0)) * z2))); end
code[z0_, z1_, z2_] := N[ArcTan[N[(z1 / N[(N[Tan[N[(N[(Pi * z0), $MachinePrecision] * -2), $MachinePrecision]], $MachinePrecision] * z2), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]
\tan^{-1} \left(\frac{z1}{\tan \left(\left(\pi \cdot z0\right) \cdot -2\right) \cdot z2}\right)
Initial program 37.0%
lift-tan.f64N/A
tan-+PI-revN/A
tan-+PI-revN/A
lower-tan.f64N/A
lift-PI.f64N/A
lift-PI.f64N/A
associate-+l+N/A
lift-+.f64N/A
lower-+.f6436.8%
Applied rewrites36.8%
Applied rewrites99.0%
lift-*.f64N/A
lift--.f64N/A
--rgt-identityN/A
*-commutativeN/A
lift-*.f64N/A
*-commutativeN/A
associate-*r*N/A
lower-*.f64N/A
lower-*.f6499.0%
Applied rewrites99.0%
herbie shell --seed 2025277 -o generate:taylor -o generate:evaluate
(FPCore (z0 z1 z2)
:name "(atan (* (tan (- (* z0 (+ PI PI)) (* -1/2 PI))) (/ z1 z2)))"
:precision binary64
(atan (* (tan (- (* z0 (+ PI PI)) (* -1/2 PI))) (/ z1 z2))))