[REBOL] Re: Core 2.6 - Last minute requests - take your chance!
From: holger:rebol at: 6-Apr-2002 19:06
On Sat, Apr 06, 2002 at 06:19:59PM -0800, Larry Palmiter wrote:
> Fix REBOL comparison operators (<, >, <=, >=, =, <>) so they work correctly
> for decimal values. Example:
>
> >> a: 2 ** 52
> == 4.5035996273705E+15
> >> b: a + 1
> == 4.5035996273705E+15
> >> a = b
> == true
> >> b - a
> == 1
> >> zero? b - a
> == false
>
> In this case a and b test equal although they differ by one. The comparison
> operators should give the same results for REBOL decimals as the underlying
> C language does for doubles. Note that ZERO?, POSITIVE?, and NEGATIVE? give
> the correct results.
The equality operator, and some others, contain an intentional "fuzziness"
for decimals to account for platform-specific differences in the way
floating point numbers are implemented. Just because they are all of type
double
in C does not mean they behave in the same way across platforms and
math libraries. There are subtle differences, e.g. whether they have hidden
precision (temporary calculation with 96-bit precision), whether rounding
occurs "down" or "towards zero" etc., and some platforms have known rounding
bugs that have to be worked around (e.g. Amiga).
The goal is not to precisely emulate the behavior of a particular math
library in C, but rather to provide a functionality that strikes a balance
between usefulness and efficiency. Having a fuzzy equality (also affecting
<= and >= in the = case) is, e.g., important when using loops with decimal
numbers. Without fuzzyness the number of loop iterations may be off by one
on some platforms, depending on the way the platform handles rounding.
--
Holger Kruse
[kruse--nordicglobal--com]