Avoiding square roots.
authorClaude Heiland-Allen <claude@mathr.co.uk>
Fri, 20 Dec 2013 21:29:39 +0000 (21:29 +0000)
committerClaude Heiland-Allen <claude@mathr.co.uk>
Fri, 20 Dec 2013 21:29:39 +0000 (21:29 +0000)
commit66567c93430e53142108cdde4b6551ebebd8c1cb
treeaf943d42f756dd1f984234fc78a41be7810d04a3
parent73850281d75235cac5dc192a2f559f5fba36ec7d
Avoiding square roots.

Our program is still on the slow side.  The cabs() function we call
to find the absolute value of each iterate is performing a square root:

    \[ |x + i y| = \sqrt{x^2 + y^2} \]

This square root is unnecessary, because if we know both sides
of a comparison are non-negative, we can square both sides and
get the same result.  Moreover, because the escape radius doesn't
change, we can lift its squaring outside all the loops.

Because we'll use this square root avoidance technique more than once,
we define a function once, then call it by name.  Our cabs2() needs to
extract the real and imaginary parts, which we can do using the functions
creal() and cimag().

Now our program runs twice as fast as the previous version:

    $ time ./mandelbrot -0.75 0 1.25 > mandelbrot.pgm
    real    0m0.864s
    user    0m0.864s
    sys     0m0.000s
mandelbrot.c