[plt-scheme] Numerical precision
On Wed, Mar 11, 2009 at 9:31 AM, Jaime Vargas <jev at mac.com> wrote:
> #lang scheme
>
> (provide numerical-precision
> (rename-out [round:N round]
> [*:N *]
> [/:N /]
> [+:N +]
> [-:N -]))
>
> (define numerical-precision (make-parameter 2))
This is a little odd. Do you expect to dynamically change the precision?
If not, then you might want to make this a regular define rather than
a parameter. If so, however, you'll have to be very careful when you
change the precision.
> (define (N)
> (expt 10 (numerical-precision)))
This is a procedure that raises 10 to the precision power every time
it is called. If the precision doesn't change, you don't need to do this
every time.
> (define (1/N)
> (/ 1 (N)))
Likewise, this computes the reciprocal every time it is called.
> (define (round:N x)
> (* (1/N) (round (* x (N)))))
And here you will notice that when you round, you will raise 10 to the
correct power
twice and take its reciprocal once.
> (define (*:N . nums)
> (round:N (apply * nums)))
>
> (define (/:N . nums)
> (round:N (apply / nums)))
>
> (define (+:N . nums)
> (round:N (apply + nums)))
>
> (define (-:N . nums)
> (round:N (apply - nums)))
You have defined something weird here. Your arithmetic is no
longer associative where you might expect it to be.
--
~jrm