[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: My suggestions to the R6RS committee about numerics
| 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?
| 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.
| <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.
| <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 >=.
| <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.