This page is about numerical aspects of complex arithmetic. A lot of numerical algorithms need complex numbers, and most object oriented programming languages like Java or Scala don’t come with an implementation of complex numbers, or, like C++, sometimes come with suboptimal implementations. This page explains how complex arithmetic needs to be implemented to avoid common trap doors.

Details

Radius

If the radius $r = \| z \|$ of a complex number $z = x + i \; y$ is calculated in the naive way

$r = \sqrt{x^2 + y^2}$

we’d get an overflow if $x$ or $y$ is bigger than the square root of the biggest representable number. This is an unnecessary overflow, since $r$ may be representable. A simple shuffling of terms avoids this:

Dividing two complex numbers could lead to unwanted overflows as well, this can be avoided by this implementation:

$\frac{a + i b}{c + i d} =
\begin{cases}
\frac{a+ b (\frac{d}{c}) + i [b - a \frac{d}{c}]}{c + d (\frac{d}{c})}
\; & \text{for} \; |c| \ge |d| \\
\frac{a (\frac{c}{d}) + b + i [b \frac{c}{d} - a ]}{c (\frac{c}{d}) + d }
\; & \text{for} \; |c| \lt |d| \;
\end{cases}$

References

William H. Press, Saul A. Teukolsky, William T. Vetterling, Brian P. Flannery: Numerical Recipes, The Art of Scientific Computing (3rd edition, chapter 5.5, webpage, ZMATH)