
(FPCore (re im) :precision binary64 (* (* 0.5 (sin re)) (+ (exp (- 0.0 im)) (exp im))))
double code(double re, double im) {
return (0.5 * sin(re)) * (exp((0.0 - im)) + exp(im));
}
real(8) function code(re, im)
use fmin_fmax_functions
real(8), intent (in) :: re
real(8), intent (in) :: im
code = (0.5d0 * sin(re)) * (exp((0.0d0 - im)) + exp(im))
end function
public static double code(double re, double im) {
return (0.5 * Math.sin(re)) * (Math.exp((0.0 - im)) + Math.exp(im));
}
def code(re, im): return (0.5 * math.sin(re)) * (math.exp((0.0 - im)) + math.exp(im))
function code(re, im) return Float64(Float64(0.5 * sin(re)) * Float64(exp(Float64(0.0 - im)) + exp(im))) end
function tmp = code(re, im) tmp = (0.5 * sin(re)) * (exp((0.0 - im)) + exp(im)); end
code[re_, im_] := N[(N[(0.5 * N[Sin[re], $MachinePrecision]), $MachinePrecision] * N[(N[Exp[N[(0.0 - im), $MachinePrecision]], $MachinePrecision] + N[Exp[im], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\left(0.5 \cdot \sin re\right) \cdot \left(e^{0 - im} + e^{im}\right)
Herbie found 8 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (re im) :precision binary64 (* (* 0.5 (sin re)) (+ (exp (- 0.0 im)) (exp im))))
double code(double re, double im) {
return (0.5 * sin(re)) * (exp((0.0 - im)) + exp(im));
}
real(8) function code(re, im)
use fmin_fmax_functions
real(8), intent (in) :: re
real(8), intent (in) :: im
code = (0.5d0 * sin(re)) * (exp((0.0d0 - im)) + exp(im))
end function
public static double code(double re, double im) {
return (0.5 * Math.sin(re)) * (Math.exp((0.0 - im)) + Math.exp(im));
}
def code(re, im): return (0.5 * math.sin(re)) * (math.exp((0.0 - im)) + math.exp(im))
function code(re, im) return Float64(Float64(0.5 * sin(re)) * Float64(exp(Float64(0.0 - im)) + exp(im))) end
function tmp = code(re, im) tmp = (0.5 * sin(re)) * (exp((0.0 - im)) + exp(im)); end
code[re_, im_] := N[(N[(0.5 * N[Sin[re], $MachinePrecision]), $MachinePrecision] * N[(N[Exp[N[(0.0 - im), $MachinePrecision]], $MachinePrecision] + N[Exp[im], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
\left(0.5 \cdot \sin re\right) \cdot \left(e^{0 - im} + e^{im}\right)
(FPCore (re im) :precision binary64 (* (sin re) (cosh im)))
double code(double re, double im) {
return sin(re) * cosh(im);
}
real(8) function code(re, im)
use fmin_fmax_functions
real(8), intent (in) :: re
real(8), intent (in) :: im
code = sin(re) * cosh(im)
end function
public static double code(double re, double im) {
return Math.sin(re) * Math.cosh(im);
}
def code(re, im): return math.sin(re) * math.cosh(im)
function code(re, im) return Float64(sin(re) * cosh(im)) end
function tmp = code(re, im) tmp = sin(re) * cosh(im); end
code[re_, im_] := N[(N[Sin[re], $MachinePrecision] * N[Cosh[im], $MachinePrecision]), $MachinePrecision]
\sin re \cdot \cosh im
Initial program 100.0%
lift-*.f64N/A
lift-*.f64N/A
associate-*l*N/A
*-commutativeN/A
associate-*l*N/A
metadata-evalN/A
mult-flipN/A
lift-+.f64N/A
+-commutativeN/A
lift-exp.f64N/A
lift-exp.f64N/A
lift--.f64N/A
sub0-negN/A
cosh-defN/A
lower-*.f64N/A
lower-cosh.f64100.0%
Applied rewrites100.0%
(FPCore (re im)
:precision binary64
(let* ((t_0 (sin (fabs re)))
(t_1 (* (* 0.5 t_0) (+ (exp (- 0.0 im)) (exp im)))))
(*
(copysign 1.0 re)
(if (<= t_1 (- INFINITY))
(*
(*
(fabs re)
(fma (* -0.16666666666666666 (fabs re)) (fabs re) 1.0))
(cosh im))
(if (<= t_1 1.0)
(* (fma (* im im) 0.5 1.0) t_0)
(* (fabs re) (cosh im)))))))double code(double re, double im) {
double t_0 = sin(fabs(re));
double t_1 = (0.5 * t_0) * (exp((0.0 - im)) + exp(im));
double tmp;
if (t_1 <= -((double) INFINITY)) {
tmp = (fabs(re) * fma((-0.16666666666666666 * fabs(re)), fabs(re), 1.0)) * cosh(im);
} else if (t_1 <= 1.0) {
tmp = fma((im * im), 0.5, 1.0) * t_0;
} else {
tmp = fabs(re) * cosh(im);
}
return copysign(1.0, re) * tmp;
}
function code(re, im) t_0 = sin(abs(re)) t_1 = Float64(Float64(0.5 * t_0) * Float64(exp(Float64(0.0 - im)) + exp(im))) tmp = 0.0 if (t_1 <= Float64(-Inf)) tmp = Float64(Float64(abs(re) * fma(Float64(-0.16666666666666666 * abs(re)), abs(re), 1.0)) * cosh(im)); elseif (t_1 <= 1.0) tmp = Float64(fma(Float64(im * im), 0.5, 1.0) * t_0); else tmp = Float64(abs(re) * cosh(im)); end return Float64(copysign(1.0, re) * tmp) end
code[re_, im_] := Block[{t$95$0 = N[Sin[N[Abs[re], $MachinePrecision]], $MachinePrecision]}, Block[{t$95$1 = N[(N[(0.5 * t$95$0), $MachinePrecision] * N[(N[Exp[N[(0.0 - im), $MachinePrecision]], $MachinePrecision] + N[Exp[im], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]}, N[(N[With[{TMP1 = Abs[1.0], TMP2 = Sign[re]}, TMP1 * If[TMP2 == 0, 1, TMP2]], $MachinePrecision] * If[LessEqual[t$95$1, (-Infinity)], N[(N[(N[Abs[re], $MachinePrecision] * N[(N[(-0.16666666666666666 * N[Abs[re], $MachinePrecision]), $MachinePrecision] * N[Abs[re], $MachinePrecision] + 1.0), $MachinePrecision]), $MachinePrecision] * N[Cosh[im], $MachinePrecision]), $MachinePrecision], If[LessEqual[t$95$1, 1.0], N[(N[(N[(im * im), $MachinePrecision] * 0.5 + 1.0), $MachinePrecision] * t$95$0), $MachinePrecision], N[(N[Abs[re], $MachinePrecision] * N[Cosh[im], $MachinePrecision]), $MachinePrecision]]]), $MachinePrecision]]]
\begin{array}{l}
t_0 := \sin \left(\left|re\right|\right)\\
t_1 := \left(0.5 \cdot t\_0\right) \cdot \left(e^{0 - im} + e^{im}\right)\\
\mathsf{copysign}\left(1, re\right) \cdot \begin{array}{l}
\mathbf{if}\;t\_1 \leq -\infty:\\
\;\;\;\;\left(\left|re\right| \cdot \mathsf{fma}\left(-0.16666666666666666 \cdot \left|re\right|, \left|re\right|, 1\right)\right) \cdot \cosh im\\
\mathbf{elif}\;t\_1 \leq 1:\\
\;\;\;\;\mathsf{fma}\left(im \cdot im, 0.5, 1\right) \cdot t\_0\\
\mathbf{else}:\\
\;\;\;\;\left|re\right| \cdot \cosh im\\
\end{array}
\end{array}
if (*.f64 (*.f64 #s(literal 1/2 binary64) (sin.f64 re)) (+.f64 (exp.f64 (-.f64 #s(literal 0 binary64) im)) (exp.f64 im))) < -inf.0Initial program 100.0%
lift-*.f64N/A
lift-*.f64N/A
associate-*l*N/A
*-commutativeN/A
associate-*l*N/A
metadata-evalN/A
mult-flipN/A
lift-+.f64N/A
+-commutativeN/A
lift-exp.f64N/A
lift-exp.f64N/A
lift--.f64N/A
sub0-negN/A
cosh-defN/A
lower-*.f64N/A
lower-cosh.f64100.0%
Applied rewrites100.0%
Taylor expanded in re around 0
lower-*.f64N/A
lower-+.f64N/A
lower-*.f64N/A
lower-pow.f6463.2%
Applied rewrites63.2%
lift-+.f64N/A
+-commutativeN/A
lift-*.f64N/A
lift-pow.f64N/A
unpow2N/A
associate-*r*N/A
lower-fma.f64N/A
lower-*.f6463.2%
Applied rewrites63.2%
if -inf.0 < (*.f64 (*.f64 #s(literal 1/2 binary64) (sin.f64 re)) (+.f64 (exp.f64 (-.f64 #s(literal 0 binary64) im)) (exp.f64 im))) < 1Initial program 100.0%
Taylor expanded in im around 0
lower-+.f64N/A
lower-sin.f64N/A
lower-*.f64N/A
lower-*.f64N/A
lower-pow.f64N/A
lower-sin.f6476.0%
Applied rewrites76.0%
lift-+.f64N/A
lift-*.f64N/A
lift-*.f64N/A
associate-*r*N/A
distribute-rgt1-inN/A
lower-*.f64N/A
*-commutativeN/A
lower-fma.f6476.0%
lift-pow.f64N/A
unpow2N/A
lower-*.f6476.0%
Applied rewrites76.0%
if 1 < (*.f64 (*.f64 #s(literal 1/2 binary64) (sin.f64 re)) (+.f64 (exp.f64 (-.f64 #s(literal 0 binary64) im)) (exp.f64 im))) Initial program 100.0%
Taylor expanded in re around 0
lower-*.f64N/A
lower-*.f64N/A
lower-+.f64N/A
lower-exp.f64N/A
lower-exp.f64N/A
lower-neg.f6463.5%
Applied rewrites63.5%
lift-*.f64N/A
*-commutativeN/A
lift-*.f64N/A
associate-*l*N/A
metadata-evalN/A
mult-flipN/A
lift-+.f64N/A
lift-exp.f64N/A
lift-exp.f64N/A
lift-neg.f64N/A
cosh-defN/A
lift-cosh.f64N/A
lower-*.f6463.5%
Applied rewrites63.5%
(FPCore (re im)
:precision binary64
(let* ((t_0 (* 0.5 (sin (fabs re))))
(t_1 (* t_0 (+ (exp (- 0.0 im)) (exp im)))))
(*
(copysign 1.0 re)
(if (<= t_1 (- INFINITY))
(*
(*
(fabs re)
(fma (* -0.16666666666666666 (fabs re)) (fabs re) 1.0))
(cosh im))
(if (<= t_1 1.0) (* t_0 2.0) (* (fabs re) (cosh im)))))))double code(double re, double im) {
double t_0 = 0.5 * sin(fabs(re));
double t_1 = t_0 * (exp((0.0 - im)) + exp(im));
double tmp;
if (t_1 <= -((double) INFINITY)) {
tmp = (fabs(re) * fma((-0.16666666666666666 * fabs(re)), fabs(re), 1.0)) * cosh(im);
} else if (t_1 <= 1.0) {
tmp = t_0 * 2.0;
} else {
tmp = fabs(re) * cosh(im);
}
return copysign(1.0, re) * tmp;
}
function code(re, im) t_0 = Float64(0.5 * sin(abs(re))) t_1 = Float64(t_0 * Float64(exp(Float64(0.0 - im)) + exp(im))) tmp = 0.0 if (t_1 <= Float64(-Inf)) tmp = Float64(Float64(abs(re) * fma(Float64(-0.16666666666666666 * abs(re)), abs(re), 1.0)) * cosh(im)); elseif (t_1 <= 1.0) tmp = Float64(t_0 * 2.0); else tmp = Float64(abs(re) * cosh(im)); end return Float64(copysign(1.0, re) * tmp) end
code[re_, im_] := Block[{t$95$0 = N[(0.5 * N[Sin[N[Abs[re], $MachinePrecision]], $MachinePrecision]), $MachinePrecision]}, Block[{t$95$1 = N[(t$95$0 * N[(N[Exp[N[(0.0 - im), $MachinePrecision]], $MachinePrecision] + N[Exp[im], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]}, N[(N[With[{TMP1 = Abs[1.0], TMP2 = Sign[re]}, TMP1 * If[TMP2 == 0, 1, TMP2]], $MachinePrecision] * If[LessEqual[t$95$1, (-Infinity)], N[(N[(N[Abs[re], $MachinePrecision] * N[(N[(-0.16666666666666666 * N[Abs[re], $MachinePrecision]), $MachinePrecision] * N[Abs[re], $MachinePrecision] + 1.0), $MachinePrecision]), $MachinePrecision] * N[Cosh[im], $MachinePrecision]), $MachinePrecision], If[LessEqual[t$95$1, 1.0], N[(t$95$0 * 2.0), $MachinePrecision], N[(N[Abs[re], $MachinePrecision] * N[Cosh[im], $MachinePrecision]), $MachinePrecision]]]), $MachinePrecision]]]
\begin{array}{l}
t_0 := 0.5 \cdot \sin \left(\left|re\right|\right)\\
t_1 := t\_0 \cdot \left(e^{0 - im} + e^{im}\right)\\
\mathsf{copysign}\left(1, re\right) \cdot \begin{array}{l}
\mathbf{if}\;t\_1 \leq -\infty:\\
\;\;\;\;\left(\left|re\right| \cdot \mathsf{fma}\left(-0.16666666666666666 \cdot \left|re\right|, \left|re\right|, 1\right)\right) \cdot \cosh im\\
\mathbf{elif}\;t\_1 \leq 1:\\
\;\;\;\;t\_0 \cdot 2\\
\mathbf{else}:\\
\;\;\;\;\left|re\right| \cdot \cosh im\\
\end{array}
\end{array}
if (*.f64 (*.f64 #s(literal 1/2 binary64) (sin.f64 re)) (+.f64 (exp.f64 (-.f64 #s(literal 0 binary64) im)) (exp.f64 im))) < -inf.0Initial program 100.0%
lift-*.f64N/A
lift-*.f64N/A
associate-*l*N/A
*-commutativeN/A
associate-*l*N/A
metadata-evalN/A
mult-flipN/A
lift-+.f64N/A
+-commutativeN/A
lift-exp.f64N/A
lift-exp.f64N/A
lift--.f64N/A
sub0-negN/A
cosh-defN/A
lower-*.f64N/A
lower-cosh.f64100.0%
Applied rewrites100.0%
Taylor expanded in re around 0
lower-*.f64N/A
lower-+.f64N/A
lower-*.f64N/A
lower-pow.f6463.2%
Applied rewrites63.2%
lift-+.f64N/A
+-commutativeN/A
lift-*.f64N/A
lift-pow.f64N/A
unpow2N/A
associate-*r*N/A
lower-fma.f64N/A
lower-*.f6463.2%
Applied rewrites63.2%
if -inf.0 < (*.f64 (*.f64 #s(literal 1/2 binary64) (sin.f64 re)) (+.f64 (exp.f64 (-.f64 #s(literal 0 binary64) im)) (exp.f64 im))) < 1Initial program 100.0%
Taylor expanded in im around 0
Applied rewrites51.1%
if 1 < (*.f64 (*.f64 #s(literal 1/2 binary64) (sin.f64 re)) (+.f64 (exp.f64 (-.f64 #s(literal 0 binary64) im)) (exp.f64 im))) Initial program 100.0%
Taylor expanded in re around 0
lower-*.f64N/A
lower-*.f64N/A
lower-+.f64N/A
lower-exp.f64N/A
lower-exp.f64N/A
lower-neg.f6463.5%
Applied rewrites63.5%
lift-*.f64N/A
*-commutativeN/A
lift-*.f64N/A
associate-*l*N/A
metadata-evalN/A
mult-flipN/A
lift-+.f64N/A
lift-exp.f64N/A
lift-exp.f64N/A
lift-neg.f64N/A
cosh-defN/A
lift-cosh.f64N/A
lower-*.f6463.5%
Applied rewrites63.5%
(FPCore (re im)
:precision binary64
(*
(copysign 1.0 re)
(if (<=
(* (* 0.5 (sin (fabs re))) (+ (exp (- 0.0 im)) (exp im)))
0.0002)
(*
(*
(fabs re)
(fma (* -0.16666666666666666 (fabs re)) (fabs re) 1.0))
(cosh im))
(* (fabs re) (cosh im)))))double code(double re, double im) {
double tmp;
if (((0.5 * sin(fabs(re))) * (exp((0.0 - im)) + exp(im))) <= 0.0002) {
tmp = (fabs(re) * fma((-0.16666666666666666 * fabs(re)), fabs(re), 1.0)) * cosh(im);
} else {
tmp = fabs(re) * cosh(im);
}
return copysign(1.0, re) * tmp;
}
function code(re, im) tmp = 0.0 if (Float64(Float64(0.5 * sin(abs(re))) * Float64(exp(Float64(0.0 - im)) + exp(im))) <= 0.0002) tmp = Float64(Float64(abs(re) * fma(Float64(-0.16666666666666666 * abs(re)), abs(re), 1.0)) * cosh(im)); else tmp = Float64(abs(re) * cosh(im)); end return Float64(copysign(1.0, re) * tmp) end
code[re_, im_] := N[(N[With[{TMP1 = Abs[1.0], TMP2 = Sign[re]}, TMP1 * If[TMP2 == 0, 1, TMP2]], $MachinePrecision] * If[LessEqual[N[(N[(0.5 * N[Sin[N[Abs[re], $MachinePrecision]], $MachinePrecision]), $MachinePrecision] * N[(N[Exp[N[(0.0 - im), $MachinePrecision]], $MachinePrecision] + N[Exp[im], $MachinePrecision]), $MachinePrecision]), $MachinePrecision], 0.0002], N[(N[(N[Abs[re], $MachinePrecision] * N[(N[(-0.16666666666666666 * N[Abs[re], $MachinePrecision]), $MachinePrecision] * N[Abs[re], $MachinePrecision] + 1.0), $MachinePrecision]), $MachinePrecision] * N[Cosh[im], $MachinePrecision]), $MachinePrecision], N[(N[Abs[re], $MachinePrecision] * N[Cosh[im], $MachinePrecision]), $MachinePrecision]]), $MachinePrecision]
\mathsf{copysign}\left(1, re\right) \cdot \begin{array}{l}
\mathbf{if}\;\left(0.5 \cdot \sin \left(\left|re\right|\right)\right) \cdot \left(e^{0 - im} + e^{im}\right) \leq 0.0002:\\
\;\;\;\;\left(\left|re\right| \cdot \mathsf{fma}\left(-0.16666666666666666 \cdot \left|re\right|, \left|re\right|, 1\right)\right) \cdot \cosh im\\
\mathbf{else}:\\
\;\;\;\;\left|re\right| \cdot \cosh im\\
\end{array}
if (*.f64 (*.f64 #s(literal 1/2 binary64) (sin.f64 re)) (+.f64 (exp.f64 (-.f64 #s(literal 0 binary64) im)) (exp.f64 im))) < 2.0000000000000001e-4Initial program 100.0%
lift-*.f64N/A
lift-*.f64N/A
associate-*l*N/A
*-commutativeN/A
associate-*l*N/A
metadata-evalN/A
mult-flipN/A
lift-+.f64N/A
+-commutativeN/A
lift-exp.f64N/A
lift-exp.f64N/A
lift--.f64N/A
sub0-negN/A
cosh-defN/A
lower-*.f64N/A
lower-cosh.f64100.0%
Applied rewrites100.0%
Taylor expanded in re around 0
lower-*.f64N/A
lower-+.f64N/A
lower-*.f64N/A
lower-pow.f6463.2%
Applied rewrites63.2%
lift-+.f64N/A
+-commutativeN/A
lift-*.f64N/A
lift-pow.f64N/A
unpow2N/A
associate-*r*N/A
lower-fma.f64N/A
lower-*.f6463.2%
Applied rewrites63.2%
if 2.0000000000000001e-4 < (*.f64 (*.f64 #s(literal 1/2 binary64) (sin.f64 re)) (+.f64 (exp.f64 (-.f64 #s(literal 0 binary64) im)) (exp.f64 im))) Initial program 100.0%
Taylor expanded in re around 0
lower-*.f64N/A
lower-*.f64N/A
lower-+.f64N/A
lower-exp.f64N/A
lower-exp.f64N/A
lower-neg.f6463.5%
Applied rewrites63.5%
lift-*.f64N/A
*-commutativeN/A
lift-*.f64N/A
associate-*l*N/A
metadata-evalN/A
mult-flipN/A
lift-+.f64N/A
lift-exp.f64N/A
lift-exp.f64N/A
lift-neg.f64N/A
cosh-defN/A
lift-cosh.f64N/A
lower-*.f6463.5%
Applied rewrites63.5%
(FPCore (re im)
:precision binary64
(*
(copysign 1.0 re)
(if (<=
(*
(* 0.5 (sin (fabs re)))
(+ (exp (- 0.0 (fabs im))) (exp (fabs im))))
-0.75)
(*
0.5
(*
(fabs re)
(+
1.0
(+
1.0
(*
(fabs im)
(-
(* (fabs im) (+ 0.5 (* -0.16666666666666666 (fabs im))))
1.0))))))
(* (fabs re) (cosh (fabs im))))))double code(double re, double im) {
double tmp;
if (((0.5 * sin(fabs(re))) * (exp((0.0 - fabs(im))) + exp(fabs(im)))) <= -0.75) {
tmp = 0.5 * (fabs(re) * (1.0 + (1.0 + (fabs(im) * ((fabs(im) * (0.5 + (-0.16666666666666666 * fabs(im)))) - 1.0)))));
} else {
tmp = fabs(re) * cosh(fabs(im));
}
return copysign(1.0, re) * tmp;
}
public static double code(double re, double im) {
double tmp;
if (((0.5 * Math.sin(Math.abs(re))) * (Math.exp((0.0 - Math.abs(im))) + Math.exp(Math.abs(im)))) <= -0.75) {
tmp = 0.5 * (Math.abs(re) * (1.0 + (1.0 + (Math.abs(im) * ((Math.abs(im) * (0.5 + (-0.16666666666666666 * Math.abs(im)))) - 1.0)))));
} else {
tmp = Math.abs(re) * Math.cosh(Math.abs(im));
}
return Math.copySign(1.0, re) * tmp;
}
def code(re, im): tmp = 0 if ((0.5 * math.sin(math.fabs(re))) * (math.exp((0.0 - math.fabs(im))) + math.exp(math.fabs(im)))) <= -0.75: tmp = 0.5 * (math.fabs(re) * (1.0 + (1.0 + (math.fabs(im) * ((math.fabs(im) * (0.5 + (-0.16666666666666666 * math.fabs(im)))) - 1.0))))) else: tmp = math.fabs(re) * math.cosh(math.fabs(im)) return math.copysign(1.0, re) * tmp
function code(re, im) tmp = 0.0 if (Float64(Float64(0.5 * sin(abs(re))) * Float64(exp(Float64(0.0 - abs(im))) + exp(abs(im)))) <= -0.75) tmp = Float64(0.5 * Float64(abs(re) * Float64(1.0 + Float64(1.0 + Float64(abs(im) * Float64(Float64(abs(im) * Float64(0.5 + Float64(-0.16666666666666666 * abs(im)))) - 1.0)))))); else tmp = Float64(abs(re) * cosh(abs(im))); end return Float64(copysign(1.0, re) * tmp) end
function tmp_2 = code(re, im) tmp = 0.0; if (((0.5 * sin(abs(re))) * (exp((0.0 - abs(im))) + exp(abs(im)))) <= -0.75) tmp = 0.5 * (abs(re) * (1.0 + (1.0 + (abs(im) * ((abs(im) * (0.5 + (-0.16666666666666666 * abs(im)))) - 1.0))))); else tmp = abs(re) * cosh(abs(im)); end tmp_2 = (sign(re) * abs(1.0)) * tmp; end
code[re_, im_] := N[(N[With[{TMP1 = Abs[1.0], TMP2 = Sign[re]}, TMP1 * If[TMP2 == 0, 1, TMP2]], $MachinePrecision] * If[LessEqual[N[(N[(0.5 * N[Sin[N[Abs[re], $MachinePrecision]], $MachinePrecision]), $MachinePrecision] * N[(N[Exp[N[(0.0 - N[Abs[im], $MachinePrecision]), $MachinePrecision]], $MachinePrecision] + N[Exp[N[Abs[im], $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision], -0.75], N[(0.5 * N[(N[Abs[re], $MachinePrecision] * N[(1.0 + N[(1.0 + N[(N[Abs[im], $MachinePrecision] * N[(N[(N[Abs[im], $MachinePrecision] * N[(0.5 + N[(-0.16666666666666666 * N[Abs[im], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision] - 1.0), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(N[Abs[re], $MachinePrecision] * N[Cosh[N[Abs[im], $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]), $MachinePrecision]
\mathsf{copysign}\left(1, re\right) \cdot \begin{array}{l}
\mathbf{if}\;\left(0.5 \cdot \sin \left(\left|re\right|\right)\right) \cdot \left(e^{0 - \left|im\right|} + e^{\left|im\right|}\right) \leq -0.75:\\
\;\;\;\;0.5 \cdot \left(\left|re\right| \cdot \left(1 + \left(1 + \left|im\right| \cdot \left(\left|im\right| \cdot \left(0.5 + -0.16666666666666666 \cdot \left|im\right|\right) - 1\right)\right)\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\left|re\right| \cdot \cosh \left(\left|im\right|\right)\\
\end{array}
if (*.f64 (*.f64 #s(literal 1/2 binary64) (sin.f64 re)) (+.f64 (exp.f64 (-.f64 #s(literal 0 binary64) im)) (exp.f64 im))) < -0.75Initial program 100.0%
Taylor expanded in re around 0
lower-*.f64N/A
lower-*.f64N/A
lower-+.f64N/A
lower-exp.f64N/A
lower-exp.f64N/A
lower-neg.f6463.5%
Applied rewrites63.5%
Taylor expanded in im around 0
Applied rewrites44.6%
Taylor expanded in im around 0
lower-+.f64N/A
lower-*.f64N/A
lower--.f64N/A
lower-*.f64N/A
lower-+.f64N/A
lower-*.f6444.4%
Applied rewrites44.4%
if -0.75 < (*.f64 (*.f64 #s(literal 1/2 binary64) (sin.f64 re)) (+.f64 (exp.f64 (-.f64 #s(literal 0 binary64) im)) (exp.f64 im))) Initial program 100.0%
Taylor expanded in re around 0
lower-*.f64N/A
lower-*.f64N/A
lower-+.f64N/A
lower-exp.f64N/A
lower-exp.f64N/A
lower-neg.f6463.5%
Applied rewrites63.5%
lift-*.f64N/A
*-commutativeN/A
lift-*.f64N/A
associate-*l*N/A
metadata-evalN/A
mult-flipN/A
lift-+.f64N/A
lift-exp.f64N/A
lift-exp.f64N/A
lift-neg.f64N/A
cosh-defN/A
lift-cosh.f64N/A
lower-*.f6463.5%
Applied rewrites63.5%
(FPCore (re im)
:precision binary64
(*
(copysign 1.0 re)
(if (<=
(*
(* 0.5 (sin (fabs re)))
(+ (exp (- 0.0 (fabs im))) (exp (fabs im))))
-0.76)
(* 0.5 (* (fabs re) (+ 1.0 (+ 1.0 (* -1.0 (fabs im))))))
(* (fabs re) (cosh (fabs im))))))double code(double re, double im) {
double tmp;
if (((0.5 * sin(fabs(re))) * (exp((0.0 - fabs(im))) + exp(fabs(im)))) <= -0.76) {
tmp = 0.5 * (fabs(re) * (1.0 + (1.0 + (-1.0 * fabs(im)))));
} else {
tmp = fabs(re) * cosh(fabs(im));
}
return copysign(1.0, re) * tmp;
}
public static double code(double re, double im) {
double tmp;
if (((0.5 * Math.sin(Math.abs(re))) * (Math.exp((0.0 - Math.abs(im))) + Math.exp(Math.abs(im)))) <= -0.76) {
tmp = 0.5 * (Math.abs(re) * (1.0 + (1.0 + (-1.0 * Math.abs(im)))));
} else {
tmp = Math.abs(re) * Math.cosh(Math.abs(im));
}
return Math.copySign(1.0, re) * tmp;
}
def code(re, im): tmp = 0 if ((0.5 * math.sin(math.fabs(re))) * (math.exp((0.0 - math.fabs(im))) + math.exp(math.fabs(im)))) <= -0.76: tmp = 0.5 * (math.fabs(re) * (1.0 + (1.0 + (-1.0 * math.fabs(im))))) else: tmp = math.fabs(re) * math.cosh(math.fabs(im)) return math.copysign(1.0, re) * tmp
function code(re, im) tmp = 0.0 if (Float64(Float64(0.5 * sin(abs(re))) * Float64(exp(Float64(0.0 - abs(im))) + exp(abs(im)))) <= -0.76) tmp = Float64(0.5 * Float64(abs(re) * Float64(1.0 + Float64(1.0 + Float64(-1.0 * abs(im)))))); else tmp = Float64(abs(re) * cosh(abs(im))); end return Float64(copysign(1.0, re) * tmp) end
function tmp_2 = code(re, im) tmp = 0.0; if (((0.5 * sin(abs(re))) * (exp((0.0 - abs(im))) + exp(abs(im)))) <= -0.76) tmp = 0.5 * (abs(re) * (1.0 + (1.0 + (-1.0 * abs(im))))); else tmp = abs(re) * cosh(abs(im)); end tmp_2 = (sign(re) * abs(1.0)) * tmp; end
code[re_, im_] := N[(N[With[{TMP1 = Abs[1.0], TMP2 = Sign[re]}, TMP1 * If[TMP2 == 0, 1, TMP2]], $MachinePrecision] * If[LessEqual[N[(N[(0.5 * N[Sin[N[Abs[re], $MachinePrecision]], $MachinePrecision]), $MachinePrecision] * N[(N[Exp[N[(0.0 - N[Abs[im], $MachinePrecision]), $MachinePrecision]], $MachinePrecision] + N[Exp[N[Abs[im], $MachinePrecision]], $MachinePrecision]), $MachinePrecision]), $MachinePrecision], -0.76], N[(0.5 * N[(N[Abs[re], $MachinePrecision] * N[(1.0 + N[(1.0 + N[(-1.0 * N[Abs[im], $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision], N[(N[Abs[re], $MachinePrecision] * N[Cosh[N[Abs[im], $MachinePrecision]], $MachinePrecision]), $MachinePrecision]]), $MachinePrecision]
\mathsf{copysign}\left(1, re\right) \cdot \begin{array}{l}
\mathbf{if}\;\left(0.5 \cdot \sin \left(\left|re\right|\right)\right) \cdot \left(e^{0 - \left|im\right|} + e^{\left|im\right|}\right) \leq -0.76:\\
\;\;\;\;0.5 \cdot \left(\left|re\right| \cdot \left(1 + \left(1 + -1 \cdot \left|im\right|\right)\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\left|re\right| \cdot \cosh \left(\left|im\right|\right)\\
\end{array}
if (*.f64 (*.f64 #s(literal 1/2 binary64) (sin.f64 re)) (+.f64 (exp.f64 (-.f64 #s(literal 0 binary64) im)) (exp.f64 im))) < -0.76000000000000001Initial program 100.0%
Taylor expanded in re around 0
lower-*.f64N/A
lower-*.f64N/A
lower-+.f64N/A
lower-exp.f64N/A
lower-exp.f64N/A
lower-neg.f6463.5%
Applied rewrites63.5%
Taylor expanded in im around 0
Applied rewrites44.6%
Taylor expanded in im around 0
lower-+.f64N/A
lower-*.f6432.7%
Applied rewrites32.7%
if -0.76000000000000001 < (*.f64 (*.f64 #s(literal 1/2 binary64) (sin.f64 re)) (+.f64 (exp.f64 (-.f64 #s(literal 0 binary64) im)) (exp.f64 im))) Initial program 100.0%
Taylor expanded in re around 0
lower-*.f64N/A
lower-*.f64N/A
lower-+.f64N/A
lower-exp.f64N/A
lower-exp.f64N/A
lower-neg.f6463.5%
Applied rewrites63.5%
lift-*.f64N/A
*-commutativeN/A
lift-*.f64N/A
associate-*l*N/A
metadata-evalN/A
mult-flipN/A
lift-+.f64N/A
lift-exp.f64N/A
lift-exp.f64N/A
lift-neg.f64N/A
cosh-defN/A
lift-cosh.f64N/A
lower-*.f6463.5%
Applied rewrites63.5%
(FPCore (re im) :precision binary64 (* 0.5 (* re (+ 1.0 (+ 1.0 (* -1.0 im))))))
double code(double re, double im) {
return 0.5 * (re * (1.0 + (1.0 + (-1.0 * im))));
}
real(8) function code(re, im)
use fmin_fmax_functions
real(8), intent (in) :: re
real(8), intent (in) :: im
code = 0.5d0 * (re * (1.0d0 + (1.0d0 + ((-1.0d0) * im))))
end function
public static double code(double re, double im) {
return 0.5 * (re * (1.0 + (1.0 + (-1.0 * im))));
}
def code(re, im): return 0.5 * (re * (1.0 + (1.0 + (-1.0 * im))))
function code(re, im) return Float64(0.5 * Float64(re * Float64(1.0 + Float64(1.0 + Float64(-1.0 * im))))) end
function tmp = code(re, im) tmp = 0.5 * (re * (1.0 + (1.0 + (-1.0 * im)))); end
code[re_, im_] := N[(0.5 * N[(re * N[(1.0 + N[(1.0 + N[(-1.0 * im), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]
0.5 \cdot \left(re \cdot \left(1 + \left(1 + -1 \cdot im\right)\right)\right)
Initial program 100.0%
Taylor expanded in re around 0
lower-*.f64N/A
lower-*.f64N/A
lower-+.f64N/A
lower-exp.f64N/A
lower-exp.f64N/A
lower-neg.f6463.5%
Applied rewrites63.5%
Taylor expanded in im around 0
Applied rewrites44.6%
Taylor expanded in im around 0
lower-+.f64N/A
lower-*.f6432.7%
Applied rewrites32.7%
(FPCore (re im) :precision binary64 (* (* 0.5 re) 2.0))
double code(double re, double im) {
return (0.5 * re) * 2.0;
}
real(8) function code(re, im)
use fmin_fmax_functions
real(8), intent (in) :: re
real(8), intent (in) :: im
code = (0.5d0 * re) * 2.0d0
end function
public static double code(double re, double im) {
return (0.5 * re) * 2.0;
}
def code(re, im): return (0.5 * re) * 2.0
function code(re, im) return Float64(Float64(0.5 * re) * 2.0) end
function tmp = code(re, im) tmp = (0.5 * re) * 2.0; end
code[re_, im_] := N[(N[(0.5 * re), $MachinePrecision] * 2.0), $MachinePrecision]
\left(0.5 \cdot re\right) \cdot 2
Initial program 100.0%
Taylor expanded in im around 0
Applied rewrites51.1%
Taylor expanded in re around 0
lower-*.f6426.9%
Applied rewrites26.9%
herbie shell --seed 2025313 -o setup:search
(FPCore (re im)
:name "math.sin on complex, real part"
:precision binary64
(* (* 0.5 (sin re)) (+ (exp (- 0.0 im)) (exp im))))