The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Number::Tolerant -- tolerance ranges for inexact numbers

SYNOPSIS

 use Number::Tolerant;

 my $range  = tolerance(10 => to => 12);
 my $random = 10 + rand(2);

 die "I shouldn't die" unless $random == $range;

 print "This line will always print.\n";

DESCRIPTION

Number::Tolerant creates a number-like object whose value refers to a range of possible values, each equally acceptable. It overloads comparison operations to reflect this.

I use this module to simplify the comparison of measurement results to specified tolerances.

 reject $product unless $measurement == $specification;

METHODS

Instantiation

There is a new method on the Number::Tolerant class, but it also exports a simple function, tolerance, which will return an object of the Number::Tolerant class. Both use the same syntax:

 my $range = tolerance( $x => $method => $y);

The meaning of $x and $y are dependant on the value of $method, which describes the nature of the tolerance. Tolerances can be defined in five ways, at present:

  method              range
 -------------------+---------------
  plus_or_minus     | x ± y
  plus_or_minus_pct | x ± (y% of x)
  or_more           | x to Inf
  or_less           | x to -Inf
  to                | x to y
  infinite          | -Inf to Inf

For or_less and or_more, $y is ignored if passed. For infinite, $x and $y are both ignored, if passed.

Overloading

Tolerances overload a few operations, mostly comparisons.

numification

Tolerances with finite ranges numify to their center values. Tolerances with infinite ranges numify to their fixed end.

stringification

A tolerance stringifies to a short description of itself.

 infinite - "any number"
 to       - "x to y"
 or_more  - "x or more"
 or_less  - "x or less"
 plus_or_minus     - "x +/- y"
 plus_or_minus_pct - "x +/- y%"
equality

A number is equal to a tolerance if it is neither less than nor greater than it. (See below).

comparison

A number is greater than a tolerance if it is greater than its maximum value.

A number is less than a tolerance if it is less than its minimum value.

No number is greater than an "or_more" tolerance or less than an "or_less" tolerance.

"...or equal to" comparisons include the min/max values in the permissible range, as common sense suggests.

tolerance intersection

A tolerance & a tolerance or number is the intersection of the two ranges. Intersections allow you to quickly narrow down a set of tolerances to the most stringent intersection of values.

 tolerance(5 => to => 6) & tolerance(5.5 => to => 6.5);
 # this yields: tolerance(5.5 => to => 6)

If the given values have no intersection, () is returned.

An intersection with a normal number will yield that number, if it is within the tolerance.

tolerance union

A tolerance | a tolerance or number is the union of the two. Unions allow multiple tolerances, whether they intersect or not, to be treated as one. See Number::Tolerant::Union for more information.

TODO

Allow translation into forms not originally used:

 $range = tolerance(9 => to => 17); 
 $range->convert_to('plus_minus');
 $range->stringify_as('plus_minus_pct');

SEE ALSO

The module Number::Range provides another way to deal with ranges of numbers. The major differences are: N::R is set-like, not range-like; N::R does not overload any operators. Number::Tolerant will not (like N::R) attempt to parse a textual range specification like "1..2,5,7..10"

The Number::Range code:

 $range = Number::Range->new("10..15","20..25");

Is equivalent to the Number::Tolerant code:

 $range = Number::Tolerant::Union->new(10..15,20..25);

...while the following code expresses an actual range:

 $range = tolerance(10 => to => 15) | tolerance(20 => to => 25);

AUTHOR

Ricardo SIGNES, <rjbs@cpan.org>

COPYRIGHT

(C) 2004, Ricardo SIGNES. Number::Tolerant is available under the same terms as Perl itself.

1 POD Error

The following errors were encountered while parsing the POD:

Around line 52:

Non-ASCII character seen before =encoding in '±'. Assuming CP1252