
(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)
use fmin_fmax_functions
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]
\sqrt{re \cdot re + im \cdot im}
Herbie found 2 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)
use fmin_fmax_functions
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]
\sqrt{re \cdot re + im \cdot im}
(FPCore modulus (re im) :precision binary64 (hypot re im))
double modulus(double re, double im) {
return hypot(re, im);
}
public static double modulus(double re, double im) {
return Math.hypot(re, im);
}
def modulus(re, im): return math.hypot(re, im)
function modulus(re, im) return hypot(re, im) end
function tmp = modulus(re, im) tmp = hypot(re, im); end
modulus[re_, im_] := N[Sqrt[re ^ 2 + im ^ 2], $MachinePrecision]
\mathsf{hypot}\left(re, im\right)
Initial program 53.6%
lift-sqrt.f64N/A
lift-+.f64N/A
lift-*.f64N/A
sqr-neg-revN/A
fp-cancel-sign-sub-invN/A
fp-cancel-sub-sign-invN/A
lift-*.f64N/A
distribute-lft-neg-inN/A
distribute-rgt-neg-outN/A
sqr-neg-revN/A
sqr-neg-revN/A
lower-hypot.f64100.0%
Applied rewrites100.0%
(FPCore modulus (re im) :precision binary64 (fmax (fabs re) (fabs im)))
double modulus(double re, double im) {
return fmax(fabs(re), fabs(im));
}
real(8) function modulus(re, im)
use fmin_fmax_functions
real(8), intent (in) :: re
real(8), intent (in) :: im
modulus = fmax(abs(re), abs(im))
end function
public static double modulus(double re, double im) {
return fmax(Math.abs(re), Math.abs(im));
}
def modulus(re, im): return fmax(math.fabs(re), math.fabs(im))
function modulus(re, im) return fmax(abs(re), abs(im)) end
function tmp = modulus(re, im) tmp = max(abs(re), abs(im)); end
modulus[re_, im_] := N[Max[N[Abs[re], $MachinePrecision], N[Abs[im], $MachinePrecision]], $MachinePrecision]
\mathsf{max}\left(\left|re\right|, \left|im\right|\right)
Initial program 53.6%
Taylor expanded in re around -inf
lower-*.f6426.3%
Applied rewrites26.3%
Taylor expanded in undef-var around zero
Applied rewrites2.7%
lift-*.f64N/A
mul-1-negN/A
lower-neg.f642.7%
Applied rewrites2.7%
Taylor expanded in im around inf
Applied rewrites27.5%
herbie shell --seed 2025313 -o setup:search
(FPCore modulus (re im)
:name "math.abs on complex"
:precision binary64
(sqrt (+ (* re re) (* im im))))