http://people.csail.mit.edu/jaffer/III/ComplexMagnitude | |
Complex Numerical Analysis |
(define (square z) (* z z)) (define (mag z) (sqrt (+ (square (real-part z)) (square (imag-part z))))) (define (div z1 z2) (define den (+ (square (real-part z2)) (square (imag-part z2)))) (make-rectangular (/ (+ (* (real-part z1) (real-part z2)) (* (imag-part z1) (imag-part z2))) den) (/ (- (* (imag-part z1) (real-part z2)) (* (real-part z1) (imag-part z2))) den)))But these routines both generate intermediate results larger or smaller than their inputs, overflowing on:
(mag 1e155+1e155i) (div 1e155+1e155i 4e155+4e155i)and underflowing on:
(mag 1e-170+1e-170i) (div 1e-170+1e-170i 4e-170+4e-170i)[The underflow in
div
causes a subsequent overflow.]
A full-range implementation is:
(define (mag z) (define c (abs (real-part z))) (define d (abs (imag-part z))) (if (< d c) (* c (sqrt (+ 1 (square (/ d c))))) (if (zero? d) d (* d (sqrt (+ 1 (square (/ c d)))))))) (define (div z1 z2) (define a (real-part z1)) (define b (imag-part z1)) (define c (real-part z2)) (define d (imag-part z2)) (if (< (abs d) (abs c)) (let ((r (/ d c))) (define den (+ c (* d r))) (make-rectangular (/ (+ a (* b r)) den) (/ (- b (* a r)) den))) (let ((r (/ c d))) (define den (+ d (* c r))) (make-rectangular (/ (+ b (* a r)) den) (/ (- a (* b r)) den)))))The number of (real) flonum operations for computing complex
magnitude
and /
are:
mag | + or - | * | / | abs | sqrt | < |
---|---|---|---|---|---|---|
naive | 1 | 2 | 0 | 0 | 1 | 0 |
full-range | 1 | 2 | 1 | 2 | 1 | 1 |
div | + or - | * | / | abs | sqrt | < |
naive | 3 | 6 | 2 | 0 | 0 | 0 |
full-range | 3 | 3 | 3 | 2 | 0 | 1 |
Floating-point abs
involves just flipping one bit; it
should be very fast. The full-range versions are unlikely to be much
slower than naive ones; full-range division is perhaps faster. The
full-range division algorithm is Smith's formula given in:
David Goldberg,
What Every Computer Scientist Should Know About Floating-Point Arithmetic,
ACM Computing Surveys, Vol. 23 No. 1, 1991
I am a guest and not a member of the MIT Computer Science and Artificial Intelligence Laboratory.
My actions and comments do not reflect in any way on MIT. | ||
CS and Numerical Analysis | ||
agj @ alum.mit.edu | Go Figure! |