
(FPCore (z0) :precision binary64 (sin (* (+ PI PI) z0)))
double code(double z0) {
return sin(((((double) M_PI) + ((double) M_PI)) * z0));
}
public static double code(double z0) {
return Math.sin(((Math.PI + Math.PI) * z0));
}
def code(z0): return math.sin(((math.pi + math.pi) * z0))
function code(z0) return sin(Float64(Float64(pi + pi) * z0)) end
function tmp = code(z0) tmp = sin(((pi + pi) * z0)); end
code[z0_] := N[Sin[N[(N[(Pi + Pi), $MachinePrecision] * z0), $MachinePrecision]], $MachinePrecision]
\sin \left(\left(\pi + \pi\right) \cdot z0\right)
Herbie found 4 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (z0) :precision binary64 (sin (* (+ PI PI) z0)))
double code(double z0) {
return sin(((((double) M_PI) + ((double) M_PI)) * z0));
}
public static double code(double z0) {
return Math.sin(((Math.PI + Math.PI) * z0));
}
def code(z0): return math.sin(((math.pi + math.pi) * z0))
function code(z0) return sin(Float64(Float64(pi + pi) * z0)) end
function tmp = code(z0) tmp = sin(((pi + pi) * z0)); end
code[z0_] := N[Sin[N[(N[(Pi + Pi), $MachinePrecision] * z0), $MachinePrecision]], $MachinePrecision]
\sin \left(\left(\pi + \pi\right) \cdot z0\right)
(FPCore (z0) :precision binary64 (* 2 (* (sin (* z0 PI)) (sin (- (* 1/2 PI) (fabs (* PI z0)))))))
double code(double z0) {
return 2.0 * (sin((z0 * ((double) M_PI))) * sin(((0.5 * ((double) M_PI)) - fabs((((double) M_PI) * z0)))));
}
public static double code(double z0) {
return 2.0 * (Math.sin((z0 * Math.PI)) * Math.sin(((0.5 * Math.PI) - Math.abs((Math.PI * z0)))));
}
def code(z0): return 2.0 * (math.sin((z0 * math.pi)) * math.sin(((0.5 * math.pi) - math.fabs((math.pi * z0)))))
function code(z0) return Float64(2.0 * Float64(sin(Float64(z0 * pi)) * sin(Float64(Float64(0.5 * pi) - abs(Float64(pi * z0)))))) end
function tmp = code(z0) tmp = 2.0 * (sin((z0 * pi)) * sin(((0.5 * pi) - abs((pi * z0))))); end
code[z0_] := N[(2 * N[(N[Sin[N[(z0 * Pi), $MachinePrecision]], $MachinePrecision] * N[Sin[N[(N[(1/2 * Pi), $MachinePrecision] - N[Abs[N[(Pi * z0), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
2 \cdot \left(\sin \left(z0 \cdot \pi\right) \cdot \sin \left(\frac{1}{2} \cdot \pi - \left|\pi \cdot z0\right|\right)\right)
Initial program 51.5%
lift-sin.f64N/A
lift-*.f64N/A
lift-+.f64N/A
count-2N/A
associate-*l*N/A
sin-2N/A
lower-*.f64N/A
*-commutativeN/A
*-commutativeN/A
lower-*.f64N/A
lower-sin.f64N/A
lower-*.f64N/A
lower-cos.f64N/A
lower-*.f6451.5%
Applied rewrites51.5%
lift-cos.f64N/A
cos-fabs-revN/A
cos-neg-revN/A
sin-+PI/2-revN/A
lower-sin.f64N/A
lower-+.f64N/A
lower-neg.f64N/A
lower-fabs.f64N/A
lift-*.f64N/A
*-commutativeN/A
lower-*.f64N/A
lift-PI.f64N/A
mult-flipN/A
lower-*.f64N/A
metadata-eval51.5%
Applied rewrites51.5%
lift-+.f64N/A
+-commutativeN/A
lift-*.f64N/A
metadata-evalN/A
mult-flip-revN/A
lift-PI.f64N/A
lift-neg.f64N/A
sub-flip-reverseN/A
lower--.f64N/A
lift-PI.f64N/A
mult-flip-revN/A
metadata-evalN/A
*-commutativeN/A
lower-*.f6451.5%
Applied rewrites51.5%
(FPCore (z0) :precision binary64 (* (copysign 1 z0) (* 2 (* (sin (* (fabs z0) PI)) (sin (* PI (+ (- (fabs z0)) 1/2)))))))
double code(double z0) {
return copysign(1.0, z0) * (2.0 * (sin((fabs(z0) * ((double) M_PI))) * sin((((double) M_PI) * (-fabs(z0) + 0.5)))));
}
public static double code(double z0) {
return Math.copySign(1.0, z0) * (2.0 * (Math.sin((Math.abs(z0) * Math.PI)) * Math.sin((Math.PI * (-Math.abs(z0) + 0.5)))));
}
def code(z0): return math.copysign(1.0, z0) * (2.0 * (math.sin((math.fabs(z0) * math.pi)) * math.sin((math.pi * (-math.fabs(z0) + 0.5)))))
function code(z0) return Float64(copysign(1.0, z0) * Float64(2.0 * Float64(sin(Float64(abs(z0) * pi)) * sin(Float64(pi * Float64(Float64(-abs(z0)) + 0.5)))))) end
function tmp = code(z0) tmp = (sign(z0) * abs(1.0)) * (2.0 * (sin((abs(z0) * pi)) * sin((pi * (-abs(z0) + 0.5))))); end
code[z0_] := N[(N[With[{TMP1 = Abs[1], TMP2 = Sign[z0]}, TMP1 * If[TMP2 == 0, 1, TMP2]], $MachinePrecision] * N[(2 * N[(N[Sin[N[(N[Abs[z0], $MachinePrecision] * Pi), $MachinePrecision]], $MachinePrecision] * N[Sin[N[(Pi * N[((-N[Abs[z0], $MachinePrecision]) + 1/2), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\mathsf{copysign}\left(1, z0\right) \cdot \left(2 \cdot \left(\sin \left(\left|z0\right| \cdot \pi\right) \cdot \sin \left(\pi \cdot \left(\left(-\left|z0\right|\right) + \frac{1}{2}\right)\right)\right)\right)
Initial program 51.5%
lift-sin.f64N/A
lift-*.f64N/A
lift-+.f64N/A
count-2N/A
associate-*l*N/A
sin-2N/A
lower-*.f64N/A
*-commutativeN/A
*-commutativeN/A
lower-*.f64N/A
lower-sin.f64N/A
lower-*.f64N/A
lower-cos.f64N/A
lower-*.f6451.5%
Applied rewrites51.5%
lift-cos.f64N/A
cos-neg-revN/A
sin-+PI/2-revN/A
lower-sin.f64N/A
lift-*.f64N/A
*-commutativeN/A
distribute-rgt-neg-inN/A
lift-PI.f64N/A
mult-flipN/A
distribute-lft-outN/A
lower-*.f64N/A
lower-+.f64N/A
lower-neg.f64N/A
metadata-eval51.5%
Applied rewrites51.5%
(FPCore (z0) :precision binary64 (* 2 (* (sin (* z0 PI)) (cos (* z0 PI)))))
double code(double z0) {
return 2.0 * (sin((z0 * ((double) M_PI))) * cos((z0 * ((double) M_PI))));
}
public static double code(double z0) {
return 2.0 * (Math.sin((z0 * Math.PI)) * Math.cos((z0 * Math.PI)));
}
def code(z0): return 2.0 * (math.sin((z0 * math.pi)) * math.cos((z0 * math.pi)))
function code(z0) return Float64(2.0 * Float64(sin(Float64(z0 * pi)) * cos(Float64(z0 * pi)))) end
function tmp = code(z0) tmp = 2.0 * (sin((z0 * pi)) * cos((z0 * pi))); end
code[z0_] := N[(2 * N[(N[Sin[N[(z0 * Pi), $MachinePrecision]], $MachinePrecision] * N[Cos[N[(z0 * Pi), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
2 \cdot \left(\sin \left(z0 \cdot \pi\right) \cdot \cos \left(z0 \cdot \pi\right)\right)
Initial program 51.5%
lift-sin.f64N/A
lift-*.f64N/A
lift-+.f64N/A
count-2N/A
associate-*l*N/A
sin-2N/A
lower-*.f64N/A
*-commutativeN/A
*-commutativeN/A
lower-*.f64N/A
lower-sin.f64N/A
lower-*.f64N/A
lower-cos.f64N/A
lower-*.f6451.5%
Applied rewrites51.5%
herbie shell --seed 2025271 -o generate:taylor -o generate:evaluate
(FPCore (z0)
:name "(sin (* (+ PI PI) z0))"
:precision binary64
(sin (* (+ PI PI) z0)))