in reply to Re: bug in Perl compilation?
in thread bug in Perl compilation?

LINUX:
0.001199999999999999894875757356 0.001200000000000000111716191853
HP-UX:
0.001199999999999999890000000000 0.001199999999999999890000000000
WIN2K (with ActivePerl):
0.001200000000000000000000000000 0.001200000000000000000000000000

Even weirder results than with duff's code.

Anybody know any way to make this portable across all the platforms?

Replies are listed 'Best First'.
Comparing Reals using a Tolerance
by ikegami (Patriarch) on Dec 21, 2005 at 19:35 UTC

    That's so weird!! I thought this was all standardized.

    Anybody know any way to make this portable across all the platforms?

    When dealing with reals, you usually need to compare within a tolerance.
    a == b
    is equivalent to
    a - b == 0
    and to
    |a - b| <= 0
    With a tolerance, it becomes
    |a - b| <= tol

    Tolerance can be absolute
    (e.g. tol = 0.0001)
    or relative
    (e.g. tol = a * 0.05)

      Hmmm... Reading your post, I wondered if it wouldn't be good to have a module that overloads this operators applying such tolerance... I took a look on CPAN and couldn't found such module.

      Update: Math::BigFloat seems to do someting like that...

      like...

      use FloatingPoint::Helper -tolerance => 0.0001; # Ok, not a good module name... my $a = FloatingPoint::Helper->float(12e-4); my $b = FloatingPoint::Helepr->float(1.2e-3); if ($a > $b) { print "really greater...\n"; } elsif ($a < $b) { print "really lesser...\n"; } else { print "almost equal...\n"; }

      It would be possibly interesting to have different tolerances for different numbers, but I don't know what to do if two numbers with different tolerances are compared, or worse, if you sum them... Maybe using the tolerance of the leftest operand... I Don't know...

      daniel
        but I don't know what to do if two numbers with different tolerances are compared

        Use the smaller of the two tolerances.