[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
MIN and MAX (long message)
Bill Rozas:
As far as I understand it (and GJS agrees with me), the example Will
shows could only be correct in an implementation where
(>= 9.999999999999998e99 #e1e100) is true. If it isn't, the
implementation of MAX/SUP is in error.
Not as I understand it. I intended for this example to illustrate
what happens in an implementation that uses IEEE 64-bit floating
point to represent inexact reals, but I goofed (because of a bug
in the least significant bit of MacScheme's implementation of
EXACT->INEXACT for large numbers). A better example is
(MAX 1.4 #e1e200) ==> 9.99999999999999969733e199
The problem with this is that
(MAX 9.99999999999999969733e199 #e1e200) ==> 9.99999999999999969733e199
while the implementation can still distinguish (in the sense of < and
>) between both arguments.
This seems wrong!
I think that requiring MAX to round up would be like requiring
(+ x y) to return a number greater than x whenever y is positive.
It sounds plausible at first, but would tend to make computations
less accurate. I have to admit, given the difficulty of coming up
with any real-world examples where MAX returns a value that is not
equal to one of its arguments, that a difference in the least
significant bit in such cases would probably be of very little
consequence, and it might make someone's mother happy.
I think your analogy is pushing it a bit. I don't expect inexact + to
follow any particular ordering properties. In fact, we know that
floating point addition (the "usual" implementation) rounds towards
even, and there are (or so I'm told) good reasons for this. I do
expect some ordering properties out of MAX/SUP, however. Otherwise I
would not be using it at all. The rule that GJS and I like, namely
that MAX/SUP should return the smallest value >= all of its arguments,
makes it more predictable than yours.