`[<<][math][>>][..]`
Sat Mar 9 18:27:23 EST 2013

Normalization

```Given a,b s.t. a^2+b^2 ~= 1, is there a fast way to push this closer
to the unit circle?  Direction doesn't matter so much.

( The a and b are sin and cos from a truncated taylor expansion. It is
probably possible to find out which of the two is systematically more
precise. )

Exact normalization would be scaling by r = 1 / sqrt(a^2 + b^2).

This needs to somehow be approximated.  Since r will be close to one,
the following taylor series could be used:

1 / (1 + x)^1/2  ~= 1 - 1/2 x

;; Approximate normalization for a^2 + b^2 close to 1
;; Exact coef: r = (a^2 + b^2)^1/2, a -> r a,  b -> r b
;; Since this is close to 1 we can use 1st order Taylor:
;; r = 1 / (1 - x)^1/2  ~=  1 + 1/2 x   with  x = 1 - (a^2 + b^2)

;; Maybe using a -> a + (r1 * a) with r1 = 1/2 x is more stable?
;; Don't think so, since x does not have many significant bits, it's
;; probably OK to hide it in the LSBs of r.

(define normalize-2D
(lambda (a b)
(let* ((a2 (* a a))
(b2 (* b b))
(x (- 1 (+ a2 b2)))
(r (+ 1 (* 0.5 x))))
(values (* r a)
(* r b)))))

```
`[Reply][About]`
`[<<][math][>>][..]`