Complex arithmetic

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.

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:

$r =
\begin{cases}
| x | \sqrt{1 + \frac{y^2}{x^2}} \; & \text{for} \; |x| \ge |y| \\
| y | \sqrt{1 + \frac{x^2}{y^2}} \; & \text{for} \; |y| \ge |x|
\end{cases}$

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}$

- 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)

category: computational methods