Here I'm not interested in accuracy (see 13614) but rather in raw speed. You'd think that for a complex machine-precision number z
, calculating Abs[z]^2
should be faster than calculating Abs[z]
because the latter requires a square root whereas the former does not. Yet it's not so:
s = RandomVariate[NormalDistribution[], {10^7, 2}].{1, I};
Developer`PackedArrayQ[s]
(* True *)
Abs[s]^2; // AbsoluteTiming // First
(* 0.083337 *)
Abs[s]; // AbsoluteTiming // First
(* 0.033179 *)
This indicates that Abs[z]^2
is really calculated by summing the squares of real and imaginary parts, taking a square root (for Abs[z]
), and then re-squaring (for Abs[z]^2
).
Is there a faster way to compute Abs[z]^2
? Is there a hidden equivalent to the GSL's gsl_complex_abs2
function? The source code of this GSL function is simply to return Re[z]^2+Im[z]^2
; no fancy tricks.