
(FPCore (z1 z0) :precision binary64 (sin (* z1 (* PI z0))))
double code(double z1, double z0) {
return sin((z1 * (((double) M_PI) * z0)));
}
public static double code(double z1, double z0) {
return Math.sin((z1 * (Math.PI * z0)));
}
def code(z1, z0): return math.sin((z1 * (math.pi * z0)))
function code(z1, z0) return sin(Float64(z1 * Float64(pi * z0))) end
function tmp = code(z1, z0) tmp = sin((z1 * (pi * z0))); end
code[z1_, z0_] := N[Sin[N[(z1 * N[(Pi * z0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]
\sin \left(z1 \cdot \left(\pi \cdot z0\right)\right)
Herbie found 6 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (z1 z0) :precision binary64 (sin (* z1 (* PI z0))))
double code(double z1, double z0) {
return sin((z1 * (((double) M_PI) * z0)));
}
public static double code(double z1, double z0) {
return Math.sin((z1 * (Math.PI * z0)));
}
def code(z1, z0): return math.sin((z1 * (math.pi * z0)))
function code(z1, z0) return sin(Float64(z1 * Float64(pi * z0))) end
function tmp = code(z1, z0) tmp = sin((z1 * (pi * z0))); end
code[z1_, z0_] := N[Sin[N[(z1 * N[(Pi * z0), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]
\sin \left(z1 \cdot \left(\pi \cdot z0\right)\right)
(FPCore (z1 z0)
:precision binary64
(*
(copysign 1.0 z1)
(*
(copysign 1.0 z0)
(if (<= (* (fabs z1) (* PI (fabs z0))) 4e+31)
(sin (* (* (fabs z0) (fabs z1)) PI))
(sin (* (fabs z1) (log 1.0)))))))double code(double z1, double z0) {
double tmp;
if ((fabs(z1) * (((double) M_PI) * fabs(z0))) <= 4e+31) {
tmp = sin(((fabs(z0) * fabs(z1)) * ((double) M_PI)));
} else {
tmp = sin((fabs(z1) * log(1.0)));
}
return copysign(1.0, z1) * (copysign(1.0, z0) * tmp);
}
public static double code(double z1, double z0) {
double tmp;
if ((Math.abs(z1) * (Math.PI * Math.abs(z0))) <= 4e+31) {
tmp = Math.sin(((Math.abs(z0) * Math.abs(z1)) * Math.PI));
} else {
tmp = Math.sin((Math.abs(z1) * Math.log(1.0)));
}
return Math.copySign(1.0, z1) * (Math.copySign(1.0, z0) * tmp);
}
def code(z1, z0): tmp = 0 if (math.fabs(z1) * (math.pi * math.fabs(z0))) <= 4e+31: tmp = math.sin(((math.fabs(z0) * math.fabs(z1)) * math.pi)) else: tmp = math.sin((math.fabs(z1) * math.log(1.0))) return math.copysign(1.0, z1) * (math.copysign(1.0, z0) * tmp)
function code(z1, z0) tmp = 0.0 if (Float64(abs(z1) * Float64(pi * abs(z0))) <= 4e+31) tmp = sin(Float64(Float64(abs(z0) * abs(z1)) * pi)); else tmp = sin(Float64(abs(z1) * log(1.0))); end return Float64(copysign(1.0, z1) * Float64(copysign(1.0, z0) * tmp)) end
function tmp_2 = code(z1, z0) tmp = 0.0; if ((abs(z1) * (pi * abs(z0))) <= 4e+31) tmp = sin(((abs(z0) * abs(z1)) * pi)); else tmp = sin((abs(z1) * log(1.0))); end tmp_2 = (sign(z1) * abs(1.0)) * ((sign(z0) * abs(1.0)) * tmp); end
code[z1_, z0_] := 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[N[(N[Abs[z1], $MachinePrecision] * N[(Pi * N[Abs[z0], $MachinePrecision]), $MachinePrecision]), $MachinePrecision], 4e+31], N[Sin[N[(N[(N[Abs[z0], $MachinePrecision] * N[Abs[z1], $MachinePrecision]), $MachinePrecision] * Pi), $MachinePrecision]], $MachinePrecision], N[Sin[N[(N[Abs[z1], $MachinePrecision] * N[Log[1.0], $MachinePrecision]), $MachinePrecision]], $MachinePrecision]]), $MachinePrecision]), $MachinePrecision]
\mathsf{copysign}\left(1, z1\right) \cdot \left(\mathsf{copysign}\left(1, z0\right) \cdot \begin{array}{l}
\mathbf{if}\;\left|z1\right| \cdot \left(\pi \cdot \left|z0\right|\right) \leq 4 \cdot 10^{+31}:\\
\;\;\;\;\sin \left(\left(\left|z0\right| \cdot \left|z1\right|\right) \cdot \pi\right)\\
\mathbf{else}:\\
\;\;\;\;\sin \left(\left|z1\right| \cdot \log 1\right)\\
\end{array}\right)
if (*.f64 z1 (*.f64 (PI.f64) z0)) < 3.9999999999999999e31Initial program 52.2%
lift-*.f64N/A
lift-*.f64N/A
*-commutativeN/A
associate-*r*N/A
lower-*.f64N/A
*-commutativeN/A
lower-*.f6452.1%
Applied rewrites52.1%
if 3.9999999999999999e31 < (*.f64 z1 (*.f64 (PI.f64) z0)) Initial program 52.2%
lift-*.f64N/A
*-commutativeN/A
lift-PI.f64N/A
add-cube-cbrtN/A
associate-*r*N/A
lower-*.f64N/A
*-commutativeN/A
lower-*.f64N/A
lift-PI.f64N/A
pow1/3N/A
lift-PI.f64N/A
pow1/3N/A
pow-prod-upN/A
lower-pow.f64N/A
metadata-evalN/A
lift-PI.f64N/A
lower-cbrt.f6451.8%
Applied rewrites51.8%
lift-*.f64N/A
*-commutativeN/A
lift-*.f64N/A
*-commutativeN/A
associate-*r*N/A
*-commutativeN/A
associate-*l*N/A
lift-cbrt.f64N/A
lift-pow.f64N/A
metadata-evalN/A
pow-sqrN/A
pow1/3N/A
pow1/3N/A
rem-3cbrt-rftN/A
rem-log-expN/A
lift-PI.f64N/A
log-pow-revN/A
lower-log.f64N/A
lift-PI.f64N/A
pow-expN/A
*-commutativeN/A
Applied rewrites23.7%
Taylor expanded in z0 around 0
Applied rewrites59.1%
(FPCore (z1 z0) :precision binary64 (sin (* (* z0 z1) PI)))
double code(double z1, double z0) {
return sin(((z0 * z1) * ((double) M_PI)));
}
public static double code(double z1, double z0) {
return Math.sin(((z0 * z1) * Math.PI));
}
def code(z1, z0): return math.sin(((z0 * z1) * math.pi))
function code(z1, z0) return sin(Float64(Float64(z0 * z1) * pi)) end
function tmp = code(z1, z0) tmp = sin(((z0 * z1) * pi)); end
code[z1_, z0_] := N[Sin[N[(N[(z0 * z1), $MachinePrecision] * Pi), $MachinePrecision]], $MachinePrecision]
\sin \left(\left(z0 \cdot z1\right) \cdot \pi\right)
Initial program 52.2%
lift-*.f64N/A
lift-*.f64N/A
*-commutativeN/A
associate-*r*N/A
lower-*.f64N/A
*-commutativeN/A
lower-*.f6452.1%
Applied rewrites52.1%
(FPCore (z1 z0) :precision binary64 (* (copysign 1.0 z1) (* (copysign 1.0 z0) (sin (* (fmin (fabs z1) (fabs z0)) (* PI (fmax (fabs z1) (fabs z0))))))))
double code(double z1, double z0) {
return copysign(1.0, z1) * (copysign(1.0, z0) * sin((fmin(fabs(z1), fabs(z0)) * (((double) M_PI) * fmax(fabs(z1), fabs(z0))))));
}
public static double code(double z1, double z0) {
return Math.copySign(1.0, z1) * (Math.copySign(1.0, z0) * Math.sin((fmin(Math.abs(z1), Math.abs(z0)) * (Math.PI * fmax(Math.abs(z1), Math.abs(z0))))));
}
def code(z1, z0): return math.copysign(1.0, z1) * (math.copysign(1.0, z0) * math.sin((fmin(math.fabs(z1), math.fabs(z0)) * (math.pi * fmax(math.fabs(z1), math.fabs(z0))))))
function code(z1, z0) return Float64(copysign(1.0, z1) * Float64(copysign(1.0, z0) * sin(Float64(fmin(abs(z1), abs(z0)) * Float64(pi * fmax(abs(z1), abs(z0))))))) end
function tmp = code(z1, z0) tmp = (sign(z1) * abs(1.0)) * ((sign(z0) * abs(1.0)) * sin((min(abs(z1), abs(z0)) * (pi * max(abs(z1), abs(z0)))))); end
code[z1_, z0_] := 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[Sin[N[(N[Min[N[Abs[z1], $MachinePrecision], N[Abs[z0], $MachinePrecision]], $MachinePrecision] * N[(Pi * N[Max[N[Abs[z1], $MachinePrecision], N[Abs[z0], $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\mathsf{copysign}\left(1, z1\right) \cdot \left(\mathsf{copysign}\left(1, z0\right) \cdot \sin \left(\mathsf{min}\left(\left|z1\right|, \left|z0\right|\right) \cdot \left(\pi \cdot \mathsf{max}\left(\left|z1\right|, \left|z0\right|\right)\right)\right)\right)
Initial program 52.2%
(FPCore (z1 z0)
:precision binary64
(let* ((t_0 (fmin (fabs z1) (fabs z0)))
(t_1 (fmax (fabs z1) (fabs z0)))
(t_2 (* t_1 t_0)))
(*
(copysign 1.0 z1)
(*
(copysign 1.0 z0)
(*
(+
(* (* (* (* (* -0.16666666666666666 t_0) PI) PI) t_2) t_1)
1.0)
(* t_2 PI))))))double code(double z1, double z0) {
double t_0 = fmin(fabs(z1), fabs(z0));
double t_1 = fmax(fabs(z1), fabs(z0));
double t_2 = t_1 * t_0;
return copysign(1.0, z1) * (copysign(1.0, z0) * (((((((-0.16666666666666666 * t_0) * ((double) M_PI)) * ((double) M_PI)) * t_2) * t_1) + 1.0) * (t_2 * ((double) M_PI))));
}
public static double code(double z1, double z0) {
double t_0 = fmin(Math.abs(z1), Math.abs(z0));
double t_1 = fmax(Math.abs(z1), Math.abs(z0));
double t_2 = t_1 * t_0;
return Math.copySign(1.0, z1) * (Math.copySign(1.0, z0) * (((((((-0.16666666666666666 * t_0) * Math.PI) * Math.PI) * t_2) * t_1) + 1.0) * (t_2 * Math.PI)));
}
def code(z1, z0): t_0 = fmin(math.fabs(z1), math.fabs(z0)) t_1 = fmax(math.fabs(z1), math.fabs(z0)) t_2 = t_1 * t_0 return math.copysign(1.0, z1) * (math.copysign(1.0, z0) * (((((((-0.16666666666666666 * t_0) * math.pi) * math.pi) * t_2) * t_1) + 1.0) * (t_2 * math.pi)))
function code(z1, z0) t_0 = fmin(abs(z1), abs(z0)) t_1 = fmax(abs(z1), abs(z0)) t_2 = Float64(t_1 * t_0) return Float64(copysign(1.0, z1) * Float64(copysign(1.0, z0) * Float64(Float64(Float64(Float64(Float64(Float64(Float64(-0.16666666666666666 * t_0) * pi) * pi) * t_2) * t_1) + 1.0) * Float64(t_2 * pi)))) end
function tmp = code(z1, z0) t_0 = min(abs(z1), abs(z0)); t_1 = max(abs(z1), abs(z0)); t_2 = t_1 * t_0; tmp = (sign(z1) * abs(1.0)) * ((sign(z0) * abs(1.0)) * (((((((-0.16666666666666666 * t_0) * pi) * pi) * t_2) * t_1) + 1.0) * (t_2 * pi))); end
code[z1_, z0_] := Block[{t$95$0 = N[Min[N[Abs[z1], $MachinePrecision], N[Abs[z0], $MachinePrecision]], $MachinePrecision]}, Block[{t$95$1 = N[Max[N[Abs[z1], $MachinePrecision], N[Abs[z0], $MachinePrecision]], $MachinePrecision]}, Block[{t$95$2 = N[(t$95$1 * t$95$0), $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[(N[(N[(N[(N[(N[(N[(-0.16666666666666666 * t$95$0), $MachinePrecision] * Pi), $MachinePrecision] * Pi), $MachinePrecision] * t$95$2), $MachinePrecision] * t$95$1), $MachinePrecision] + 1.0), $MachinePrecision] * N[(t$95$2 * Pi), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]]]
\begin{array}{l}
t_0 := \mathsf{min}\left(\left|z1\right|, \left|z0\right|\right)\\
t_1 := \mathsf{max}\left(\left|z1\right|, \left|z0\right|\right)\\
t_2 := t\_1 \cdot t\_0\\
\mathsf{copysign}\left(1, z1\right) \cdot \left(\mathsf{copysign}\left(1, z0\right) \cdot \left(\left(\left(\left(\left(\left(-0.16666666666666666 \cdot t\_0\right) \cdot \pi\right) \cdot \pi\right) \cdot t\_2\right) \cdot t\_1 + 1\right) \cdot \left(t\_2 \cdot \pi\right)\right)\right)
\end{array}
Initial program 52.2%
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
lift-+.f64N/A
distribute-lft-inN/A
lift-*.f64N/A
associate-*l*N/A
*-commutativeN/A
lift-*.f64N/A
fp-cancel-sign-sub-invN/A
lower--.f64N/A
Applied rewrites41.4%
lift-*.f64N/A
lift-*.f64N/A
associate-*r*N/A
lift-*.f64N/A
associate-*r*N/A
lower-*.f64N/A
Applied rewrites49.9%
lift--.f64N/A
lift-*.f64N/A
lift-*.f64N/A
lift-neg.f64N/A
distribute-lft-neg-outN/A
*-commutativeN/A
lift-*.f64N/A
fp-cancel-sign-subN/A
lift-*.f64N/A
Applied rewrites50.1%
(FPCore (z1 z0) :precision binary64 (* (* z0 z1) PI))
double code(double z1, double z0) {
return (z0 * z1) * ((double) M_PI);
}
public static double code(double z1, double z0) {
return (z0 * z1) * Math.PI;
}
def code(z1, z0): return (z0 * z1) * math.pi
function code(z1, z0) return Float64(Float64(z0 * z1) * pi) end
function tmp = code(z1, z0) tmp = (z0 * z1) * pi; end
code[z1_, z0_] := N[(N[(z0 * z1), $MachinePrecision] * Pi), $MachinePrecision]
\left(z0 \cdot z1\right) \cdot \pi
Initial program 52.2%
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%
Taylor expanded in z1 around 0
lower-*.f64N/A
lower-*.f64N/A
lower-PI.f6450.1%
Applied rewrites50.1%
lift-*.f64N/A
lift-*.f64N/A
associate-*l*N/A
lift-*.f64N/A
lift-*.f6450.1%
Applied rewrites50.1%
(FPCore (z1 z0) :precision binary64 (* z0 (* z1 PI)))
double code(double z1, double z0) {
return z0 * (z1 * ((double) M_PI));
}
public static double code(double z1, double z0) {
return z0 * (z1 * Math.PI);
}
def code(z1, z0): return z0 * (z1 * math.pi)
function code(z1, z0) return Float64(z0 * Float64(z1 * pi)) end
function tmp = code(z1, z0) tmp = z0 * (z1 * pi); end
code[z1_, z0_] := N[(z0 * N[(z1 * Pi), $MachinePrecision]), $MachinePrecision]
z0 \cdot \left(z1 \cdot \pi\right)
Initial program 52.2%
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%
Taylor expanded in z1 around 0
lower-*.f64N/A
lower-*.f64N/A
lower-PI.f6450.1%
Applied rewrites50.1%
herbie shell --seed 2025250
(FPCore (z1 z0)
:name "(sin (* z1 (* PI z0)))"
:precision binary64
(sin (* z1 (* PI z0))))