
(FPCore modulus (re im) :precision binary64 (sqrt (+ (* re re) (* im im))))
double modulus(double re, double im) {
return sqrt(((re * re) + (im * im)));
}
real(8) function modulus(re, im)
real(8), intent (in) :: re
real(8), intent (in) :: im
modulus = sqrt(((re * re) + (im * im)))
end function
public static double modulus(double re, double im) {
return Math.sqrt(((re * re) + (im * im)));
}
def modulus(re, im): return math.sqrt(((re * re) + (im * im)))
function modulus(re, im) return sqrt(Float64(Float64(re * re) + Float64(im * im))) end
function tmp = modulus(re, im) tmp = sqrt(((re * re) + (im * im))); end
modulus[re_, im_] := N[Sqrt[N[(N[(re * re), $MachinePrecision] + N[(im * im), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]
\begin{array}{l}
\\
\sqrt{re \cdot re + im \cdot im}
\end{array}
Sampling outcomes in binary64 precision:
Herbie found 4 alternatives:
| Alternative | Accuracy | Speedup |
|---|
(FPCore modulus (re im) :precision binary64 (sqrt (+ (* re re) (* im im))))
double modulus(double re, double im) {
return sqrt(((re * re) + (im * im)));
}
real(8) function modulus(re, im)
real(8), intent (in) :: re
real(8), intent (in) :: im
modulus = sqrt(((re * re) + (im * im)))
end function
public static double modulus(double re, double im) {
return Math.sqrt(((re * re) + (im * im)));
}
def modulus(re, im): return math.sqrt(((re * re) + (im * im)))
function modulus(re, im) return sqrt(Float64(Float64(re * re) + Float64(im * im))) end
function tmp = modulus(re, im) tmp = sqrt(((re * re) + (im * im))); end
modulus[re_, im_] := N[Sqrt[N[(N[(re * re), $MachinePrecision] + N[(im * im), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]
\begin{array}{l}
\\
\sqrt{re \cdot re + im \cdot im}
\end{array}
im_m = (fabs.f64 im) re_m = (fabs.f64 re) NOTE: re_m and im_m should be sorted in increasing order before calling this function. (FPCore modulus (re_m im_m) :precision binary64 (fma re_m (/ (* re_m 0.5) im_m) im_m))
im_m = fabs(im);
re_m = fabs(re);
assert(re_m < im_m);
double modulus(double re_m, double im_m) {
return fma(re_m, ((re_m * 0.5) / im_m), im_m);
}
im_m = abs(im) re_m = abs(re) re_m, im_m = sort([re_m, im_m]) function modulus(re_m, im_m) return fma(re_m, Float64(Float64(re_m * 0.5) / im_m), im_m) end
im_m = N[Abs[im], $MachinePrecision] re_m = N[Abs[re], $MachinePrecision] NOTE: re_m and im_m should be sorted in increasing order before calling this function. modulus[re$95$m_, im$95$m_] := N[(re$95$m * N[(N[(re$95$m * 0.5), $MachinePrecision] / im$95$m), $MachinePrecision] + im$95$m), $MachinePrecision]
\begin{array}{l}
im_m = \left|im\right|
\\
re_m = \left|re\right|
\\
[re_m, im_m] = \mathsf{sort}([re_m, im_m])\\
\\
\mathsf{fma}\left(re\_m, \frac{re\_m \cdot 0.5}{im\_m}, im\_m\right)
\end{array}
Initial program 54.9%
Taylor expanded in re around 0
+-commutativeN/A
*-lft-identityN/A
associate-*l/N/A
associate-*l*N/A
unpow2N/A
associate-*r*N/A
*-commutativeN/A
lower-fma.f64N/A
associate-*r/N/A
metadata-evalN/A
associate-*l/N/A
lower-/.f64N/A
*-commutativeN/A
lower-*.f64100.0
Applied rewrites100.0%
im_m = (fabs.f64 im) re_m = (fabs.f64 re) NOTE: re_m and im_m should be sorted in increasing order before calling this function. (FPCore modulus (re_m im_m) :precision binary64 (sqrt (fma re_m re_m (* im_m im_m))))
im_m = fabs(im);
re_m = fabs(re);
assert(re_m < im_m);
double modulus(double re_m, double im_m) {
return sqrt(fma(re_m, re_m, (im_m * im_m)));
}
im_m = abs(im) re_m = abs(re) re_m, im_m = sort([re_m, im_m]) function modulus(re_m, im_m) return sqrt(fma(re_m, re_m, Float64(im_m * im_m))) end
im_m = N[Abs[im], $MachinePrecision] re_m = N[Abs[re], $MachinePrecision] NOTE: re_m and im_m should be sorted in increasing order before calling this function. modulus[re$95$m_, im$95$m_] := N[Sqrt[N[(re$95$m * re$95$m + N[(im$95$m * im$95$m), $MachinePrecision]), $MachinePrecision]], $MachinePrecision]
\begin{array}{l}
im_m = \left|im\right|
\\
re_m = \left|re\right|
\\
[re_m, im_m] = \mathsf{sort}([re_m, im_m])\\
\\
\sqrt{\mathsf{fma}\left(re\_m, re\_m, im\_m \cdot im\_m\right)}
\end{array}
Initial program 53.6%
lift-+.f64N/A
lift-*.f64N/A
lower-fma.f6453.6
Applied rewrites53.6%
herbie shell --seed 2024228
(FPCore modulus (re im)
:name "math.abs on complex"
:precision binary64
(sqrt (+ (* re re) (* im im))))