
(FPCore (x.re x.im y.re y.im) :precision binary64 (- (* x.re y.re) (* x.im y.im)))
double code(double x_46_re, double x_46_im, double y_46_re, double y_46_im) {
return (x_46_re * y_46_re) - (x_46_im * y_46_im);
}
real(8) function code(x_46re, x_46im, y_46re, y_46im)
real(8), intent (in) :: x_46re
real(8), intent (in) :: x_46im
real(8), intent (in) :: y_46re
real(8), intent (in) :: y_46im
code = (x_46re * y_46re) - (x_46im * y_46im)
end function
public static double code(double x_46_re, double x_46_im, double y_46_re, double y_46_im) {
return (x_46_re * y_46_re) - (x_46_im * y_46_im);
}
def code(x_46_re, x_46_im, y_46_re, y_46_im): return (x_46_re * y_46_re) - (x_46_im * y_46_im)
function code(x_46_re, x_46_im, y_46_re, y_46_im) return Float64(Float64(x_46_re * y_46_re) - Float64(x_46_im * y_46_im)) end
function tmp = code(x_46_re, x_46_im, y_46_re, y_46_im) tmp = (x_46_re * y_46_re) - (x_46_im * y_46_im); end
code[x$46$re_, x$46$im_, y$46$re_, y$46$im_] := N[(N[(x$46$re * y$46$re), $MachinePrecision] - N[(x$46$im * y$46$im), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
x.re \cdot y.re - x.im \cdot y.im
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 4 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore (x.re x.im y.re y.im) :precision binary64 (- (* x.re y.re) (* x.im y.im)))
double code(double x_46_re, double x_46_im, double y_46_re, double y_46_im) {
return (x_46_re * y_46_re) - (x_46_im * y_46_im);
}
real(8) function code(x_46re, x_46im, y_46re, y_46im)
real(8), intent (in) :: x_46re
real(8), intent (in) :: x_46im
real(8), intent (in) :: y_46re
real(8), intent (in) :: y_46im
code = (x_46re * y_46re) - (x_46im * y_46im)
end function
public static double code(double x_46_re, double x_46_im, double y_46_re, double y_46_im) {
return (x_46_re * y_46_re) - (x_46_im * y_46_im);
}
def code(x_46_re, x_46_im, y_46_re, y_46_im): return (x_46_re * y_46_re) - (x_46_im * y_46_im)
function code(x_46_re, x_46_im, y_46_re, y_46_im) return Float64(Float64(x_46_re * y_46_re) - Float64(x_46_im * y_46_im)) end
function tmp = code(x_46_re, x_46_im, y_46_re, y_46_im) tmp = (x_46_re * y_46_re) - (x_46_im * y_46_im); end
code[x$46$re_, x$46$im_, y$46$re_, y$46$im_] := N[(N[(x$46$re * y$46$re), $MachinePrecision] - N[(x$46$im * y$46$im), $MachinePrecision]), $MachinePrecision]
\begin{array}{l}
\\
x.re \cdot y.re - x.im \cdot y.im
\end{array}
(FPCore (x.re x.im y.re y.im) :precision binary64 (let* ((t_0 (- (* x.re y.re) (* x.im y.im)))) (if (<= t_0 1e+304) t_0 (* x.re (- y.re (* y.im (/ x.im x.re)))))))
double code(double x_46_re, double x_46_im, double y_46_re, double y_46_im) {
double t_0 = (x_46_re * y_46_re) - (x_46_im * y_46_im);
double tmp;
if (t_0 <= 1e+304) {
tmp = t_0;
} else {
tmp = x_46_re * (y_46_re - (y_46_im * (x_46_im / x_46_re)));
}
return tmp;
}
real(8) function code(x_46re, x_46im, y_46re, y_46im)
real(8), intent (in) :: x_46re
real(8), intent (in) :: x_46im
real(8), intent (in) :: y_46re
real(8), intent (in) :: y_46im
real(8) :: t_0
real(8) :: tmp
t_0 = (x_46re * y_46re) - (x_46im * y_46im)
if (t_0 <= 1d+304) then
tmp = t_0
else
tmp = x_46re * (y_46re - (y_46im * (x_46im / x_46re)))
end if
code = tmp
end function
public static double code(double x_46_re, double x_46_im, double y_46_re, double y_46_im) {
double t_0 = (x_46_re * y_46_re) - (x_46_im * y_46_im);
double tmp;
if (t_0 <= 1e+304) {
tmp = t_0;
} else {
tmp = x_46_re * (y_46_re - (y_46_im * (x_46_im / x_46_re)));
}
return tmp;
}
def code(x_46_re, x_46_im, y_46_re, y_46_im): t_0 = (x_46_re * y_46_re) - (x_46_im * y_46_im) tmp = 0 if t_0 <= 1e+304: tmp = t_0 else: tmp = x_46_re * (y_46_re - (y_46_im * (x_46_im / x_46_re))) return tmp
function code(x_46_re, x_46_im, y_46_re, y_46_im) t_0 = Float64(Float64(x_46_re * y_46_re) - Float64(x_46_im * y_46_im)) tmp = 0.0 if (t_0 <= 1e+304) tmp = t_0; else tmp = Float64(x_46_re * Float64(y_46_re - Float64(y_46_im * Float64(x_46_im / x_46_re)))); end return tmp end
function tmp_2 = code(x_46_re, x_46_im, y_46_re, y_46_im) t_0 = (x_46_re * y_46_re) - (x_46_im * y_46_im); tmp = 0.0; if (t_0 <= 1e+304) tmp = t_0; else tmp = x_46_re * (y_46_re - (y_46_im * (x_46_im / x_46_re))); end tmp_2 = tmp; end
code[x$46$re_, x$46$im_, y$46$re_, y$46$im_] := Block[{t$95$0 = N[(N[(x$46$re * y$46$re), $MachinePrecision] - N[(x$46$im * y$46$im), $MachinePrecision]), $MachinePrecision]}, If[LessEqual[t$95$0, 1e+304], t$95$0, N[(x$46$re * N[(y$46$re - N[(y$46$im * N[(x$46$im / x$46$re), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := x.re \cdot y.re - x.im \cdot y.im\\
\mathbf{if}\;t\_0 \leq 10^{+304}:\\
\;\;\;\;t\_0\\
\mathbf{else}:\\
\;\;\;\;x.re \cdot \left(y.re - y.im \cdot \frac{x.im}{x.re}\right)\\
\end{array}
\end{array}
if (-.f64 (*.f64 x.re y.re) (*.f64 x.im y.im)) < 9.9999999999999994e303Initial program 100.0%
if 9.9999999999999994e303 < (-.f64 (*.f64 x.re y.re) (*.f64 x.im y.im)) Initial program 84.4%
Taylor expanded in x.re around inf 96.9%
mul-1-neg96.9%
unsub-neg96.9%
*-commutative96.9%
associate-/l*100.0%
Simplified100.0%
(FPCore (x.re x.im y.re y.im) :precision binary64 (if (or (<= (* x.re y.re) -2.1e+55) (not (<= (* x.re y.re) 1.65e-68))) (* x.re y.re) (* x.im (- y.im))))
double code(double x_46_re, double x_46_im, double y_46_re, double y_46_im) {
double tmp;
if (((x_46_re * y_46_re) <= -2.1e+55) || !((x_46_re * y_46_re) <= 1.65e-68)) {
tmp = x_46_re * y_46_re;
} else {
tmp = x_46_im * -y_46_im;
}
return tmp;
}
real(8) function code(x_46re, x_46im, y_46re, y_46im)
real(8), intent (in) :: x_46re
real(8), intent (in) :: x_46im
real(8), intent (in) :: y_46re
real(8), intent (in) :: y_46im
real(8) :: tmp
if (((x_46re * y_46re) <= (-2.1d+55)) .or. (.not. ((x_46re * y_46re) <= 1.65d-68))) then
tmp = x_46re * y_46re
else
tmp = x_46im * -y_46im
end if
code = tmp
end function
public static double code(double x_46_re, double x_46_im, double y_46_re, double y_46_im) {
double tmp;
if (((x_46_re * y_46_re) <= -2.1e+55) || !((x_46_re * y_46_re) <= 1.65e-68)) {
tmp = x_46_re * y_46_re;
} else {
tmp = x_46_im * -y_46_im;
}
return tmp;
}
def code(x_46_re, x_46_im, y_46_re, y_46_im): tmp = 0 if ((x_46_re * y_46_re) <= -2.1e+55) or not ((x_46_re * y_46_re) <= 1.65e-68): tmp = x_46_re * y_46_re else: tmp = x_46_im * -y_46_im return tmp
function code(x_46_re, x_46_im, y_46_re, y_46_im) tmp = 0.0 if ((Float64(x_46_re * y_46_re) <= -2.1e+55) || !(Float64(x_46_re * y_46_re) <= 1.65e-68)) tmp = Float64(x_46_re * y_46_re); else tmp = Float64(x_46_im * Float64(-y_46_im)); end return tmp end
function tmp_2 = code(x_46_re, x_46_im, y_46_re, y_46_im) tmp = 0.0; if (((x_46_re * y_46_re) <= -2.1e+55) || ~(((x_46_re * y_46_re) <= 1.65e-68))) tmp = x_46_re * y_46_re; else tmp = x_46_im * -y_46_im; end tmp_2 = tmp; end
code[x$46$re_, x$46$im_, y$46$re_, y$46$im_] := If[Or[LessEqual[N[(x$46$re * y$46$re), $MachinePrecision], -2.1e+55], N[Not[LessEqual[N[(x$46$re * y$46$re), $MachinePrecision], 1.65e-68]], $MachinePrecision]], N[(x$46$re * y$46$re), $MachinePrecision], N[(x$46$im * (-y$46$im)), $MachinePrecision]]
\begin{array}{l}
\\
\begin{array}{l}
\mathbf{if}\;x.re \cdot y.re \leq -2.1 \cdot 10^{+55} \lor \neg \left(x.re \cdot y.re \leq 1.65 \cdot 10^{-68}\right):\\
\;\;\;\;x.re \cdot y.re\\
\mathbf{else}:\\
\;\;\;\;x.im \cdot \left(-y.im\right)\\
\end{array}
\end{array}
if (*.f64 x.re y.re) < -2.1000000000000001e55 or 1.6499999999999999e-68 < (*.f64 x.re y.re) Initial program 96.2%
Taylor expanded in x.re around inf 78.9%
if -2.1000000000000001e55 < (*.f64 x.re y.re) < 1.6499999999999999e-68Initial program 100.0%
Taylor expanded in x.re around 0 79.3%
mul-1-neg79.3%
distribute-rgt-neg-out79.3%
Simplified79.3%
Final simplification79.1%
(FPCore (x.re x.im y.re y.im) :precision binary64 (let* ((t_0 (- (* x.re y.re) (* x.im y.im)))) (if (<= t_0 INFINITY) t_0 (* x.im (- y.im)))))
double code(double x_46_re, double x_46_im, double y_46_re, double y_46_im) {
double t_0 = (x_46_re * y_46_re) - (x_46_im * y_46_im);
double tmp;
if (t_0 <= ((double) INFINITY)) {
tmp = t_0;
} else {
tmp = x_46_im * -y_46_im;
}
return tmp;
}
public static double code(double x_46_re, double x_46_im, double y_46_re, double y_46_im) {
double t_0 = (x_46_re * y_46_re) - (x_46_im * y_46_im);
double tmp;
if (t_0 <= Double.POSITIVE_INFINITY) {
tmp = t_0;
} else {
tmp = x_46_im * -y_46_im;
}
return tmp;
}
def code(x_46_re, x_46_im, y_46_re, y_46_im): t_0 = (x_46_re * y_46_re) - (x_46_im * y_46_im) tmp = 0 if t_0 <= math.inf: tmp = t_0 else: tmp = x_46_im * -y_46_im return tmp
function code(x_46_re, x_46_im, y_46_re, y_46_im) t_0 = Float64(Float64(x_46_re * y_46_re) - Float64(x_46_im * y_46_im)) tmp = 0.0 if (t_0 <= Inf) tmp = t_0; else tmp = Float64(x_46_im * Float64(-y_46_im)); end return tmp end
function tmp_2 = code(x_46_re, x_46_im, y_46_re, y_46_im) t_0 = (x_46_re * y_46_re) - (x_46_im * y_46_im); tmp = 0.0; if (t_0 <= Inf) tmp = t_0; else tmp = x_46_im * -y_46_im; end tmp_2 = tmp; end
code[x$46$re_, x$46$im_, y$46$re_, y$46$im_] := Block[{t$95$0 = N[(N[(x$46$re * y$46$re), $MachinePrecision] - N[(x$46$im * y$46$im), $MachinePrecision]), $MachinePrecision]}, If[LessEqual[t$95$0, Infinity], t$95$0, N[(x$46$im * (-y$46$im)), $MachinePrecision]]]
\begin{array}{l}
\\
\begin{array}{l}
t_0 := x.re \cdot y.re - x.im \cdot y.im\\
\mathbf{if}\;t\_0 \leq \infty:\\
\;\;\;\;t\_0\\
\mathbf{else}:\\
\;\;\;\;x.im \cdot \left(-y.im\right)\\
\end{array}
\end{array}
if (-.f64 (*.f64 x.re y.re) (*.f64 x.im y.im)) < +inf.0Initial program 100.0%
if +inf.0 < (-.f64 (*.f64 x.re y.re) (*.f64 x.im y.im)) Initial program 0.0%
Taylor expanded in x.re around 0 80.0%
mul-1-neg80.0%
distribute-rgt-neg-out80.0%
Simplified80.0%
(FPCore (x.re x.im y.re y.im) :precision binary64 (* x.re y.re))
double code(double x_46_re, double x_46_im, double y_46_re, double y_46_im) {
return x_46_re * y_46_re;
}
real(8) function code(x_46re, x_46im, y_46re, y_46im)
real(8), intent (in) :: x_46re
real(8), intent (in) :: x_46im
real(8), intent (in) :: y_46re
real(8), intent (in) :: y_46im
code = x_46re * y_46re
end function
public static double code(double x_46_re, double x_46_im, double y_46_re, double y_46_im) {
return x_46_re * y_46_re;
}
def code(x_46_re, x_46_im, y_46_re, y_46_im): return x_46_re * y_46_re
function code(x_46_re, x_46_im, y_46_re, y_46_im) return Float64(x_46_re * y_46_re) end
function tmp = code(x_46_re, x_46_im, y_46_re, y_46_im) tmp = x_46_re * y_46_re; end
code[x$46$re_, x$46$im_, y$46$re_, y$46$im_] := N[(x$46$re * y$46$re), $MachinePrecision]
\begin{array}{l}
\\
x.re \cdot y.re
\end{array}
Initial program 98.0%
Taylor expanded in x.re around inf 52.5%
herbie shell --seed 2024085
(FPCore (x.re x.im y.re y.im)
:name "_multiplyComplex, real part"
:precision binary64
(- (* x.re y.re) (* x.im y.im)))