Upgrade to CPAN-1.88_79
[p5sagit/p5-mst-13.2.git] / lib / bignum.pm
index fb7db9f..7796d47 100644 (file)
@@ -1,13 +1,14 @@
 package bignum;
-require 5.005;
+use 5.006002;
 
-$VERSION = '0.13';
+$VERSION = '0.19';
 use Exporter;
 @EXPORT_OK     = qw( ); 
 @EXPORT        = qw( inf NaN ); 
 @ISA           = qw( Exporter );
 
 use strict;
+use overload;
 
 ############################################################################## 
 
@@ -33,7 +34,7 @@ sub AUTOLOAD
         if (defined $_[0])
           {
           Math::BigInt->$name($_[0]);
-          Math::BigFloat->$name($_[0]);
+          return Math::BigFloat->$name($_[0]);
           }
         return Math::BigInt->$name();
         };
@@ -55,7 +56,20 @@ sub upgrade
 #    $Math::BigInt::upgrade = $_[0];
 #    $Math::BigFloat::upgrade = $_[0];
 #    }
-  return $Math::BigInt::upgrade;
+  $Math::BigInt::upgrade;
+  }
+
+sub _binary_constant
+  {
+  # this takes a binary/hexadecimal/octal constant string and returns it
+  # as string suitable for new. Basically it converts octal to decimal, and
+  # passes every thing else unmodified back.
+  my $string = shift;
+
+  return Math::BigInt->new($string) if $string =~ /^0[bx]/;
+
+  # so it must be an octal constant
+  Math::BigInt->from_oct($string);
   }
 
 sub import 
@@ -63,7 +77,7 @@ sub import
   my $self = shift;
 
   # some defaults
-  my $lib = 'Calc';
+  my $lib = '';
   my $upgrade = 'Math::BigFloat';
   my $downgrade = 'Math::BigInt';
 
@@ -140,9 +154,10 @@ sub import
       }
     require Math::BigInt if $_lite == 0;       # not already loaded?
     $class = 'Math::BigInt';                   # regardless of MBIL or not
-    } 
+    }
+  push @import, 'try' => $lib if $lib ne ''; 
   # Math::BigInt::Trace or plain Math::BigInt
-  $class->import(@import, upgrade => $upgrade, lib => $lib);
+  $class->import(@import, upgrade => $upgrade);
 
   if ($trace)
     {
@@ -167,6 +182,10 @@ sub import
     print "Math::BigFloat\t\t v$Math::BigFloat::VERSION\n";
     exit;
     }
+
+  # Take care of octal/hexadecimal constants
+  overload::constant 'binary' => sub { _binary_constant(shift) };
+
   $self->export_to_level(1,$self,@a);          # export inf and NaN
   }
 
@@ -217,13 +236,13 @@ You can see this with the following:
 
 Don't worry if it says Math::BigInt::Lite, bignum and friends will use Lite
 if it is installed since it is faster for some operations. It will be
-automatically upgraded to BigInt whenever neccessary:
+automatically upgraded to BigInt whenever necessary:
 
         perl -Mbignum -le 'print ref(2**255)'
 
 This also means it is a bad idea to check for some specific package, since
 the actual contents of $x might be something unexpected. Due to the
-transparent way of bignum C<ref()> should not be neccessary, anyway.
+transparent way of bignum C<ref()> should not be necessary, anyway.
 
 Since Math::BigInt and BigFloat also overload the normal math operations,
 the following line will still work:
@@ -291,7 +310,7 @@ overloading of '..' is not yet possible in Perl (as of v5.8.0):
 
         perl -Mbignum -le 'for (1..2) { print ref($_); }'
 
-=head2 OPTIONS
+=head2 Options
 
 bignum recognizes some options that can be passed while loading it via use.
 The options can (currently) be either a single letter form, or the long form.
@@ -306,6 +325,8 @@ than or equal to zero. See Math::BigInt's bround() function for details.
 
        perl -Mbignum=a,50 -le 'print sqrt(20)'
 
+Note that setting precision and accurary at the same time is not possible.
+
 =item p or precision
 
 This sets the precision for all math operations. The argument can be any
@@ -315,6 +336,8 @@ integer. See Math::BigInt's bfround() function for details.
 
        perl -Mbignum=p,-50 -le 'print sqrt(20)'
 
+Note that setting precision and accurary at the same time is not possible.
+
 =item t or trace
 
 This enables a trace mode and is primarily for debugging bignum or
@@ -327,15 +350,21 @@ Load a different math lib, see L<MATH LIBRARY>.
        perl -Mbignum=l,GMP -e 'print 2 ** 512'
 
 Currently there is no way to specify more than one library on the command
-line. This will be hopefully fixed soon ;)
+line. This means the following does not work:
+
+       perl -Mbignum=l,GMP,Pari -e 'print 2 ** 512'
+
+This will be hopefully fixed soon ;)
 
 =item v or version
 
 This prints out the name and version of all modules used and then exits.
 
-       perl -Mbignum=v -e ''
+       perl -Mbignum=v
+
+=back
 
-=head2 METHODS
+=head2 Methods
 
 Beside import() and AUTOLOAD() there are only a few other methods.
 
@@ -344,16 +373,54 @@ the BigInt or BigFloat API. It is wise to use only the bxxx() notation, and not
 the fxxx() notation, though. This makes it possible that the underlying object
 might morph into a different class than BigFloat.
 
+=head2 Caveat
+
+But a warning is in order. When using the following to make a copy of a number,
+only a shallow copy will be made.
+
+        $x = 9; $y = $x;
+        $x = $y = 7;
+
+If you want to make a real copy, use the following:
+
+        $y = $x->copy();
+
+Using the copy or the original with overloaded math is okay, e.g. the
+following work:
+
+        $x = 9; $y = $x;
+        print $x + 1, " ", $y,"\n";     # prints 10 9
+
+but calling any method that modifies the number directly will result in
+B<both> the original and the copy being destroyed:
+
+        $x = 9; $y = $x;
+        print $x->badd(1), " ", $y,"\n";        # prints 10 10
+
+        $x = 9; $y = $x;
+        print $x->binc(1), " ", $y,"\n";        # prints 10 10
+
+        $x = 9; $y = $x;
+        print $x->bmul(2), " ", $y,"\n";        # prints 18 18
+
+Using methods that do not modify, but testthe contents works:
+
+        $x = 9; $y = $x;
+        $z = 9 if $x->is_zero();                # works fine
+
+See the documentation about the copy constructor and C<=> in overload, as
+well as the documentation in BigInt for further details.
+
 =over 2
 
 =item inf()
 
-A shortcut to return Math::BigInt->binf(). Usefull because Perl does not always
+A shortcut to return Math::BigInt->binf(). Useful because Perl does not always
 handle bareword C<inf> properly.
 
 =item NaN()
 
-A shortcut to return Math::BigInt->bnan(). Usefull because Perl does not always
+A shortcut to return Math::BigInt->bnan(). Useful because Perl does not always
 handle bareword C<NaN> properly.
 
 =item upgrade()
@@ -427,6 +494,7 @@ Some cool command line examples to impress the Python crowd ;)
        perl -Mbignum -le 'print log(2)'
        perl -Mbignum -le 'print 2 ** 0.5'
        perl -Mbignum=a,65 -le 'print 2 ** 0.2'
+       perl -Mbignum=a,65,l,GMP -le 'print 7 ** 7777'
 
 =head1 LICENSE
 
@@ -442,6 +510,6 @@ as L<Math::BigInt::BitVect>, L<Math::BigInt::Pari> and  L<Math::BigInt::GMP>.
 
 =head1 AUTHORS
 
-(C) by Tels L<http://bloodgate.com/> in early 2002.
+(C) by Tels L<http://bloodgate.com/> in early 2002 - 2007.
 
 =cut