# APM: Perl zero not being zero, but 7e-12

Wayne Walker wwalker at bybent.com
Mon Sep 12 23:38:18 PDT 2005

```On Tue, Sep 13, 2005 at 01:23:40AM -0500, tmcd at panix.com wrote:
> On Tue, 13 Sep 2005, Wayne Walker <wwalker at bybent.com> wrote:
> > Number::Tolerant seems to be one way, but YECH.
>
> Why "YECH"?  It's a library designed for this particular sort of
> problem, and at a cursory glance it looks like it's a reasonable
> implementation.  When you have to start worrying about the fact that
> computers can't represent your numbers exactly, it's an intrinsically
> messy and worrisome problem.
The Yech is that fit's too much overhead for most problems.

Somthine like the folllowing would at least not require creation of
objects for each number while providing much or all of what David needs.

package Float::AlmostEqual;

use Exporter;
@EXPORT = qw(ae);

our \$precision = 0.0000000001;

sub ae
{
my ( \$a, \$b ) = @_;
my \$delta = ( \$a - \$b );
return ( abs(\$delta) < \$precision );
}

sub re    # reasonably equal
{
my ( \$a, \$b ) = @_;
my \$delta = ( \$a - \$b );
my \$precision;
my ( \$aa, \$ab );
\$aa = abs(\$a);
\$ab = abs(\$b);
my \$min = min( \$aa, \$ab );
\$precision = \$min / 1000000000;
return ( abs(\$delta) < \$precision );
}

The above is a vetting the concept, yes I know re() uses an arbitrary
non-pure-math way of deciding on precision, but will work for almost any
problem.  But with it, David could do all his normal porgramming, just
searching for \$a == \$b and replace with ae(\$a,\$b).

If he is doing financial, then Math::FixedPrecision or something similar
is the way to go.

--

Wayne Walker

wwalker at bybent.com                    Do you use Linux?!
http://www.bybent.com                 Get Counted!  http://counter.li.org/
Perl - http://www.perl.org/           Perl User Groups - http://www.pm.org/
Jabber:  wwalker at jabber.gnumber.com   AIM:     lwwalkerbybent
IRC:     wwalker on freenode.net
```