
(FPCore (z1 z0) :precision binary64 (sin (* PI (* z1 z0))))
double code(double z1, double z0) {
return sin((((double) M_PI) * (z1 * z0)));
}
public static double code(double z1, double z0) {
return Math.sin((Math.PI * (z1 * z0)));
}
def code(z1, z0): return math.sin((math.pi * (z1 * z0)))
function code(z1, z0) return sin(Float64(pi * Float64(z1 * z0))) end
function tmp = code(z1, z0) tmp = sin((pi * (z1 * z0))); end
code[z1_, z0_] := N[Sin[N[(Pi * N[(z1 * z0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]
\sin \left(\pi \cdot \left(z1 \cdot z0\right)\right)
Herbie found 4 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (z1 z0) :precision binary64 (sin (* PI (* z1 z0))))
double code(double z1, double z0) {
return sin((((double) M_PI) * (z1 * z0)));
}
public static double code(double z1, double z0) {
return Math.sin((Math.PI * (z1 * z0)));
}
def code(z1, z0): return math.sin((math.pi * (z1 * z0)))
function code(z1, z0) return sin(Float64(pi * Float64(z1 * z0))) end
function tmp = code(z1, z0) tmp = sin((pi * (z1 * z0))); end
code[z1_, z0_] := N[Sin[N[(Pi * N[(z1 * z0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]
\sin \left(\pi \cdot \left(z1 \cdot z0\right)\right)
(FPCore (z1 z0)
:precision binary64
(let* ((t_0 (* PI (* (fabs z1) (fabs z0)))))
(*
(copysign 1.0 z1)
(*
(copysign 1.0 z0)
(if (<= t_0 4e+31) (sin t_0) (sin (* (log 1.0) (fabs z0))))))))double code(double z1, double z0) {
double t_0 = ((double) M_PI) * (fabs(z1) * fabs(z0));
double tmp;
if (t_0 <= 4e+31) {
tmp = sin(t_0);
} else {
tmp = sin((log(1.0) * fabs(z0)));
}
return copysign(1.0, z1) * (copysign(1.0, z0) * tmp);
}
public static double code(double z1, double z0) {
double t_0 = Math.PI * (Math.abs(z1) * Math.abs(z0));
double tmp;
if (t_0 <= 4e+31) {
tmp = Math.sin(t_0);
} else {
tmp = Math.sin((Math.log(1.0) * Math.abs(z0)));
}
return Math.copySign(1.0, z1) * (Math.copySign(1.0, z0) * tmp);
}
def code(z1, z0): t_0 = math.pi * (math.fabs(z1) * math.fabs(z0)) tmp = 0 if t_0 <= 4e+31: tmp = math.sin(t_0) else: tmp = math.sin((math.log(1.0) * math.fabs(z0))) return math.copysign(1.0, z1) * (math.copysign(1.0, z0) * tmp)
function code(z1, z0) t_0 = Float64(pi * Float64(abs(z1) * abs(z0))) tmp = 0.0 if (t_0 <= 4e+31) tmp = sin(t_0); else tmp = sin(Float64(log(1.0) * abs(z0))); end return Float64(copysign(1.0, z1) * Float64(copysign(1.0, z0) * tmp)) end
function tmp_2 = code(z1, z0) t_0 = pi * (abs(z1) * abs(z0)); tmp = 0.0; if (t_0 <= 4e+31) tmp = sin(t_0); else tmp = sin((log(1.0) * abs(z0))); end tmp_2 = (sign(z1) * abs(1.0)) * ((sign(z0) * abs(1.0)) * tmp); end
code[z1_, z0_] := Block[{t$95$0 = N[(Pi * N[(N[Abs[z1], $MachinePrecision] * N[Abs[z0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]}, N[(N[With[{TMP1 = Abs[1.0], TMP2 = Sign[z1]}, TMP1 * If[TMP2 == 0, 1, TMP2]], $MachinePrecision] * N[(N[With[{TMP1 = Abs[1.0], TMP2 = Sign[z0]}, TMP1 * If[TMP2 == 0, 1, TMP2]], $MachinePrecision] * If[LessEqual[t$95$0, 4e+31], N[Sin[t$95$0], $MachinePrecision], N[Sin[N[(N[Log[1.0], $MachinePrecision] * N[Abs[z0], $MachinePrecision]), $MachinePrecision]], $MachinePrecision]]), $MachinePrecision]), $MachinePrecision]]
\begin{array}{l}
t_0 := \pi \cdot \left(\left|z1\right| \cdot \left|z0\right|\right)\\
\mathsf{copysign}\left(1, z1\right) \cdot \left(\mathsf{copysign}\left(1, z0\right) \cdot \begin{array}{l}
\mathbf{if}\;t\_0 \leq 4 \cdot 10^{+31}:\\
\;\;\;\;\sin t\_0\\
\mathbf{else}:\\
\;\;\;\;\sin \left(\log 1 \cdot \left|z0\right|\right)\\
\end{array}\right)
\end{array}
if (*.f64 (PI.f64) (*.f64 z1 z0)) < 3.9999999999999999e31Initial program 52.1%
if 3.9999999999999999e31 < (*.f64 (PI.f64) (*.f64 z1 z0)) Initial program 52.1%
lift-*.f64N/A
lift-*.f64N/A
associate-*r*N/A
lower-*.f64N/A
*-commutativeN/A
lower-*.f6452.2%
Applied rewrites52.2%
lift-*.f64N/A
lift-PI.f64N/A
add-log-expN/A
log-pow-revN/A
lower-log.f64N/A
lift-PI.f64N/A
pow-expN/A
*-commutativeN/A
lift-*.f64N/A
lower-exp.f6423.1%
Applied rewrites23.1%
Taylor expanded in z1 around 0
Applied rewrites59.1%
(FPCore (z1 z0)
:precision binary64
(let* ((t_0 (fmax (fabs z1) (fabs z0)))
(t_1 (- t_0))
(t_2 (fmin (fabs z1) (fabs z0))))
(*
(copysign 1.0 z1)
(*
(copysign 1.0 z0)
(*
t_2
(+
(*
-0.16666666666666666
(* (* (* (* t_0 (* (* (* t_2 t_2) PI) PI)) PI) t_1) t_1))
(* t_0 PI)))))))double code(double z1, double z0) {
double t_0 = fmax(fabs(z1), fabs(z0));
double t_1 = -t_0;
double t_2 = fmin(fabs(z1), fabs(z0));
return copysign(1.0, z1) * (copysign(1.0, z0) * (t_2 * ((-0.16666666666666666 * ((((t_0 * (((t_2 * t_2) * ((double) M_PI)) * ((double) M_PI))) * ((double) M_PI)) * t_1) * t_1)) + (t_0 * ((double) M_PI)))));
}
public static double code(double z1, double z0) {
double t_0 = fmax(Math.abs(z1), Math.abs(z0));
double t_1 = -t_0;
double t_2 = fmin(Math.abs(z1), Math.abs(z0));
return Math.copySign(1.0, z1) * (Math.copySign(1.0, z0) * (t_2 * ((-0.16666666666666666 * ((((t_0 * (((t_2 * t_2) * Math.PI) * Math.PI)) * Math.PI) * t_1) * t_1)) + (t_0 * Math.PI))));
}
def code(z1, z0): t_0 = fmax(math.fabs(z1), math.fabs(z0)) t_1 = -t_0 t_2 = fmin(math.fabs(z1), math.fabs(z0)) return math.copysign(1.0, z1) * (math.copysign(1.0, z0) * (t_2 * ((-0.16666666666666666 * ((((t_0 * (((t_2 * t_2) * math.pi) * math.pi)) * math.pi) * t_1) * t_1)) + (t_0 * math.pi))))
function code(z1, z0) t_0 = fmax(abs(z1), abs(z0)) t_1 = Float64(-t_0) t_2 = fmin(abs(z1), abs(z0)) return Float64(copysign(1.0, z1) * Float64(copysign(1.0, z0) * Float64(t_2 * Float64(Float64(-0.16666666666666666 * Float64(Float64(Float64(Float64(t_0 * Float64(Float64(Float64(t_2 * t_2) * pi) * pi)) * pi) * t_1) * t_1)) + Float64(t_0 * pi))))) end
function tmp = code(z1, z0) t_0 = max(abs(z1), abs(z0)); t_1 = -t_0; t_2 = min(abs(z1), abs(z0)); tmp = (sign(z1) * abs(1.0)) * ((sign(z0) * abs(1.0)) * (t_2 * ((-0.16666666666666666 * ((((t_0 * (((t_2 * t_2) * pi) * pi)) * pi) * t_1) * t_1)) + (t_0 * pi)))); end
code[z1_, z0_] := Block[{t$95$0 = N[Max[N[Abs[z1], $MachinePrecision], N[Abs[z0], $MachinePrecision]], $MachinePrecision]}, Block[{t$95$1 = (-t$95$0)}, Block[{t$95$2 = N[Min[N[Abs[z1], $MachinePrecision], N[Abs[z0], $MachinePrecision]], $MachinePrecision]}, N[(N[With[{TMP1 = Abs[1.0], TMP2 = Sign[z1]}, TMP1 * If[TMP2 == 0, 1, TMP2]], $MachinePrecision] * N[(N[With[{TMP1 = Abs[1.0], TMP2 = Sign[z0]}, TMP1 * If[TMP2 == 0, 1, TMP2]], $MachinePrecision] * N[(t$95$2 * N[(N[(-0.16666666666666666 * N[(N[(N[(N[(t$95$0 * N[(N[(N[(t$95$2 * t$95$2), $MachinePrecision] * Pi), $MachinePrecision] * Pi), $MachinePrecision]), $MachinePrecision] * Pi), $MachinePrecision] * t$95$1), $MachinePrecision] * t$95$1), $MachinePrecision]), $MachinePrecision] + N[(t$95$0 * Pi), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]]]
\begin{array}{l}
t_0 := \mathsf{max}\left(\left|z1\right|, \left|z0\right|\right)\\
t_1 := -t\_0\\
t_2 := \mathsf{min}\left(\left|z1\right|, \left|z0\right|\right)\\
\mathsf{copysign}\left(1, z1\right) \cdot \left(\mathsf{copysign}\left(1, z0\right) \cdot \left(t\_2 \cdot \left(-0.16666666666666666 \cdot \left(\left(\left(\left(t\_0 \cdot \left(\left(\left(t\_2 \cdot t\_2\right) \cdot \pi\right) \cdot \pi\right)\right) \cdot \pi\right) \cdot t\_1\right) \cdot t\_1\right) + t\_0 \cdot \pi\right)\right)\right)
\end{array}
Initial program 52.1%
lift-*.f64N/A
lift-*.f64N/A
*-commutativeN/A
associate-*r*N/A
lower-*.f64N/A
*-commutativeN/A
lower-*.f6452.2%
Applied rewrites52.2%
lift-*.f64N/A
lift-*.f64N/A
associate-*l*N/A
*-commutativeN/A
lift-*.f64N/A
*-commutativeN/A
lift-*.f64N/A
associate-*l*N/A
rem-cube-cbrtN/A
lift-cbrt.f64N/A
pow3N/A
pow2N/A
lift-cbrt.f64N/A
pow-cbrtN/A
metadata-evalN/A
lift-pow.f64N/A
associate-*l*N/A
*-commutativeN/A
associate-*l*N/A
*-commutativeN/A
lift-*.f64N/A
Applied rewrites51.8%
Taylor expanded in z1 around 0
lower-*.f64N/A
lower-+.f64N/A
lower-*.f64N/A
lower-*.f64N/A
lower-pow.f64N/A
lower-*.f64N/A
lower-pow.f64N/A
lower-pow.f64N/A
lower-PI.f64N/A
lower-*.f64N/A
lower-PI.f6441.6%
Applied rewrites41.6%
lift-*.f64N/A
*-commutativeN/A
lift-pow.f64N/A
cube-multN/A
associate-*r*N/A
sqr-neg-revN/A
associate-*r*N/A
lower-*.f64N/A
Applied rewrites47.0%
(FPCore (z1 z0) :precision binary64 (* (copysign 1.0 z1) (* (fmin (fabs z1) z0) (* (fmax (fabs z1) z0) PI))))
double code(double z1, double z0) {
return copysign(1.0, z1) * (fmin(fabs(z1), z0) * (fmax(fabs(z1), z0) * ((double) M_PI)));
}
public static double code(double z1, double z0) {
return Math.copySign(1.0, z1) * (fmin(Math.abs(z1), z0) * (fmax(Math.abs(z1), z0) * Math.PI));
}
def code(z1, z0): return math.copysign(1.0, z1) * (fmin(math.fabs(z1), z0) * (fmax(math.fabs(z1), z0) * math.pi))
function code(z1, z0) return Float64(copysign(1.0, z1) * Float64(fmin(abs(z1), z0) * Float64(fmax(abs(z1), z0) * pi))) end
function tmp = code(z1, z0) tmp = (sign(z1) * abs(1.0)) * (min(abs(z1), z0) * (max(abs(z1), z0) * pi)); end
code[z1_, z0_] := N[(N[With[{TMP1 = Abs[1.0], TMP2 = Sign[z1]}, TMP1 * If[TMP2 == 0, 1, TMP2]], $MachinePrecision] * N[(N[Min[N[Abs[z1], $MachinePrecision], z0], $MachinePrecision] * N[(N[Max[N[Abs[z1], $MachinePrecision], z0], $MachinePrecision] * Pi), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\mathsf{copysign}\left(1, z1\right) \cdot \left(\mathsf{min}\left(\left|z1\right|, z0\right) \cdot \left(\mathsf{max}\left(\left|z1\right|, z0\right) \cdot \pi\right)\right)
Initial program 52.1%
lift-*.f64N/A
lift-*.f64N/A
*-commutativeN/A
associate-*r*N/A
lower-*.f64N/A
*-commutativeN/A
lower-*.f6452.2%
Applied rewrites52.2%
lift-*.f64N/A
lift-*.f64N/A
associate-*l*N/A
*-commutativeN/A
lift-*.f64N/A
*-commutativeN/A
lift-*.f64N/A
associate-*l*N/A
rem-cube-cbrtN/A
lift-cbrt.f64N/A
pow3N/A
pow2N/A
lift-cbrt.f64N/A
pow-cbrtN/A
metadata-evalN/A
lift-pow.f64N/A
associate-*l*N/A
*-commutativeN/A
associate-*l*N/A
*-commutativeN/A
lift-*.f64N/A
Applied rewrites51.8%
Taylor expanded in z1 around 0
lower-*.f64N/A
lower-+.f64N/A
lower-*.f64N/A
lower-*.f64N/A
lower-pow.f64N/A
lower-*.f64N/A
lower-pow.f64N/A
lower-pow.f64N/A
lower-PI.f64N/A
lower-*.f64N/A
lower-PI.f6441.6%
Applied rewrites41.6%
Taylor expanded in z1 around 0
lower-*.f64N/A
lower-PI.f6450.1%
Applied rewrites50.1%
herbie shell --seed 2025250
(FPCore (z1 z0)
:name "(sin (* PI (* z1 z0)))"
:precision binary64
(sin (* PI (* z1 z0))))