[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: My suggestions to the R6RS committee about numerics



Hi, Aubrey:

We already discussed many of these issues on various threads in  
comp.lang.scheme.

On May 20, 2005, at 2:13 PM, Aubrey Jaffer wrote:

>  | From: Bradley Lucier <lucier@xxxxxxxxxxxxxxx>
>  | Date: Wed, 18 May 2005 22:38:43 +0200
>  |
>  | .., I sent document about proposed changes to numerics to
>  | Marc Feeley last March to forward to the committee.  Since then my
>  | thinking has evolved a bit, but I thought I would just include my
>  | comments verbatim here.
>  |
>  | Brad
>  |
>  | The first part deals with IEEE 754/854 arithmetic.  If you don't
>  | support this arithmetic, then things are still up in the air.
>  |
>  | 6.1 Equivalence predicates
>  | ...
>  |     Note: This section does not state under which conditions eqv?
>  |     returns #t or #f for inexact numbers that are not in IEEE  
> 754/854
>  |     format.  We recommend that numbers not in IEEE 754/854  
> format for
>  |     which a base, sign, number of exponent digits, exponent bias,
>  |     biased exponent, number of significand digits, and  
> significand can
>  |     be defined follow the same rules as above.
>
> Why are you restricting the specification of inexacts to IEEE-754/854
> arthmetic?

I'm not doing as you suggest; perhaps you misinterpret my  
recommendation.

>
>  | 6.2.5. Numerical operations
>  |
>  | (number? obj )                           procedure
>  | (complex? obj )                          procedure
>  | (real? obj )                             procedure
>  | (rational? obj )                         procedure
>  | (integer? obj )                          procedure
> ...
>  |                   <add this>
>  | If an implementation uses IEEE 754/854 format for inexact  
> numbers then:
>  |
>  | * If z is an inexact complex number, then (real? z) is true if and
>  |   only if both (exact? (imag-part z)) and (zero? (imag-part z)) are
>  |   true.
> ...
>  | For implementations that allow (real z) and (imag z) to have  
> different
>  | exactness, then (exact? z) returns #t if and only if both (exact?
>  | (real z)) and (exact? (imag z)) return #t.
>  |               <end of addition>
>
> A number is either exact or inexact; and a complex number (like a
> rational number) is one number, not two.  Exactness thus applies to
> the whole complex number, not to its components.

Is this an objection to part of my recommendation? Under my  
recommendation,
(exact? z) still returns either #t or #f.


>
>  |           <change the following predicates>
>  | (zero? z) library procedure
>  | (positive? x) library procedure
>  | (negative? x) library procedure
>  | (odd? n) library procedure
>  | (even? n) library procedure
>  | These numerical predicates test a number for a particular
>  | property, returning #t or #f.
>  |
>  | If an implementation uses IEEE 754/854 format for its inexact  
> numbers,
>  | then zero?, positive?, and negative? return #f if called with a NaN
>  | argument.
>
> The names of the arguments already restrict positive?, negative?, odd?
> and even? to argument types to which NaN does not belong.  Passing NaN
> to them is an error.

I didn't understand this comment until I read the one below.  I take  
it from
your next comment that NaN is not real; I disagree.

>
>  |           <change the following procedures>
>  |
>  | (max x1 x2 : : : ) library procedure
>  | (min x1 x2 : : : ) library procedure
>  |
>  | These procedures return the maximum or minimum of their arguments.
>  |
>  | (max 3 4) =) 4 ; exact
>  | (max 3.9 4) =) 4.0 ; inexact
>  |
>  | If an implementation uses IEEE 754/854 format for its inexact  
> numbers,
>  | and any of the arguments to max and min are NaNs, then max and min
>  | returns one of the NaN arguments as its result.
>
> IEEE NaN is not real, having no position in the well-ordered
> real-numbers.  It is thus an illegal argument to MAX, MIN, <, <=, >,
> and >=.

Again, I disagree; I would follow IEEE 754/854 practice and require that
NaN be unordered wrt any other value (including itself), but that it  
still
be real (but not rational).

>
>  |           <change the following procedures>
>  | (+ z1 : : : ) procedure
>  | (* z1 : : : ) procedure
>  |
>  | These procedures return the sum or product of their arguments.
>  |
>  | (+ 3 4) =) 7
>  | (+ 3) =) 3
>  | (+) =) 0
>  | (* 4) =) 4
>  | (*) =) 1
>  |
>  |     Note: We recommend that (+ 0 z) => z, (* 1 z) => z, and (* 0  
> z) =>
>  |     0 for all z.  This simplifies some rules for addition and
>  |     multiplication for complex and inexact numbers if an
>  |     implementation uses IEEE 754/854 format for its inexact
>  |     arithmetic.
>
> Processors have either hardware to manipulate floating-point numbers,
> or library routines to emulate the hardware.  Changing the IEEE-754
> rules (so that 0 * NaN --> 0) will complicate, not simplify the
> implementation of numerics.

Perhaps you misunderstand my notation (which I believe to be  
standard, by the
way).  By "0" I mean "exact 0", not inexact 0, thus not IEEE-754 0.   
Since
I know of no current processor that has a "multiply a floating-point  
number
by an exact integer" instruction, then I don't think your objection  
here is valid.

I also find it ironic that you're very willing to change the  
semantics of Scheme
in your immediately previous suggestion to disallow the use of  
hardware compare
instructions for comparing IEEE-754 values, while complaining about a  
perceived
(but in truth, false) problem in my specification that you imagine  
would disallow
the use of hardware multiply.

Brad