package bigint;
-require 5.005;
+use 5.006002;
-$VERSION = '0.07';
+$VERSION = '0.09';
use Exporter;
@ISA = qw( Exporter );
@EXPORT_OK = qw( );
# {
# $Math::BigInt::upgrade = $_[0];
# }
- return $Math::BigInt::upgrade;
+ $Math::BigInt::upgrade;
}
-sub _constant
+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 _float_constant
{
# this takes a floating point constant string and returns it truncated to
# integer. For instance, '4.5' => '4', '1.234e2' => '123' etc
return $sign.$$miv.$$mfv.'E'.$ec; # 123.45e+3 => 12345e1
}
$mfv = substr($$mfv,0,$ec);
- return $sign.$$miv.$mfv; # 123.45e+1 => 1234
+ $sign.$$miv.$mfv; # 123.45e+1 => 1234
}
sub import
require Math::BigInt if $_lite == 0; # not already loaded?
$class = 'Math::BigInt'; # regardless of MBIL or not
}
- push @import, 'lib' => $lib if $lib ne '';
+ push @import, 'try' => $lib if $lib ne '';
# Math::BigInt::Trace or plain Math::BigInt
$class->import(@import);
}
# we take care of floating point constants, since BigFloat isn't available
# and BigInt doesn't like them:
- overload::constant float => sub { Math::BigInt->new( _constant(shift) ); };
+ overload::constant float => sub { Math::BigInt->new( _float_constant(shift) ); };
+ # Take care of octal/hexadecimal constants
+ overload::constant binary => sub { _binary_constant(shift) };
$self->export_to_level(1,$self,@a); # export inf and NaN
}
perl -Mbigint=a,2 -le 'print 12345+1'
+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
perl -Mbignum=p,5 -le 'print 123456789+123'
+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 bigint or
perl -Mbigint=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
perl -Mbigint=v
+=back
+
=head2 Math Library
Math with the numbers is done (by default) by a module called
the BigInt API. You can only use the bxxx() notation, and not the fxxx()
notation, though.
+=over 2
+
+=item inf()
+
+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(). Useful because Perl does not always
+handle bareword C<NaN> properly.
+
+=item upgrade()
+
+Return the class that numbers are upgraded to, is in fact returning
+C<$Math::BigInt::upgrade>.
+
+=back
+
+=head2 MATH LIBRARY
+
+Math with the numbers is done (by default) by a module called
+
=head2 Caveat
But a warning is in order. When using the following to make a copy of a number,
perl -Mbigint -le 'print log(2)'
perl -Mbigint -le 'print 2 ** 0.5'
perl -Mbigint=a,65 -le 'print 2 ** 0.2'
+ perl -Mbignum=a,65,l,GMP -le 'print 7 ** 7777'
=head1 LICENSE
=head1 AUTHORS
-(C) by Tels L<http://bloodgate.com/> in early 2002 - 2005.
+(C) by Tels L<http://bloodgate.com/> in early 2002 - 2007.
=cut
package bignum;
-require 5.005;
+use 5.006002;
-$VERSION = '0.17';
+$VERSION = '0.19';
use Exporter;
@EXPORT_OK = qw( );
@EXPORT = qw( inf NaN );
@ISA = qw( Exporter );
use strict;
+use overload;
##############################################################################
# $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
require Math::BigInt if $_lite == 0; # not already loaded?
$class = 'Math::BigInt'; # regardless of MBIL or not
}
- push @import, 'lib' => $lib if $lib ne '';
+ push @import, 'try' => $lib if $lib ne '';
# Math::BigInt::Trace or plain Math::BigInt
$class->import(@import, upgrade => $upgrade);
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
}
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
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
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
perl -Mbignum=v
+=back
+
=head2 Methods
Beside import() and AUTOLOAD() there are only a few other methods.
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
=head1 AUTHORS
-(C) by Tels L<http://bloodgate.com/> in early 2002, 2003.
+(C) by Tels L<http://bloodgate.com/> in early 2002 - 2007.
=cut
$| = 1;
chdir 't' if -d 't';
unshift @INC, '../lib';
- plan tests => 32;
+ plan tests => 36;
}
use bigint;
{
my ($x,$y) = split /:/;
print "# Try $x\n";
- ok (bigint::_constant("$x"),"$y");
+ ok (bigint::_float_constant("$x"),"$y");
+ }
+
+foreach (qw/
+ 0100:64
+ 0200:128
+ 0x100:256
+ 0b1001:9
+ /)
+ {
+ my ($x,$y) = split /:/;
+ print "# Try $x\n";
+ ok (bigint::_binary_constant("$x"),"$y");
}
###############################################################################
package bigrat;
-require 5.005;
+use 5.006002;
-$VERSION = '0.08';
+$VERSION = '0.09';
require Exporter;
@ISA = qw( Exporter );
@EXPORT_OK = qw( );
@EXPORT = qw( inf NaN );
use strict;
+use overload;
##############################################################################
# $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
print "Math::BigRat\t\t v$Math::BigRat::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
}
the fxxx() notation, though. This makes you independed on the fact that the
underlying object might morph into a different class than BigFloat.
-=head2 Caveat
+=over 2
+
+=item inf()
+
+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(). Useful because Perl does not always
+handle bareword C<NaN> properly.
+
+=item upgrade()
+
+Return the class that numbers are upgraded to, is in fact returning
+C<$Math::BigInt::upgrade>.
+
+=back
+
+=head2 MATH LIBRARY
+
+Math with the numbers is done (by default) by a module called
+
+=head2 Cavaet
But a warning is in order. When using the following to make a copy of a number,
only a shallow copy will be made.
perl -Mbigrat=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
perl -Mbigrat=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
perl -Mbigrat=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
perl -Mbigrat=v
+=back
+
=head1 EXAMPLES
perl -Mbigrat -le 'print sqrt(33)'
perl -Mbigrat -le 'print 4.5+2*255'
perl -Mbigrat -le 'print 3/7 + 5/7 + 8/3'
perl -Mbigrat -le 'print 12->is_odd()';
+ perl -Mbignum=l,GMP -le 'print 7 ** 7777'
=head1 LICENSE
=head1 AUTHORS
-(C) by Tels L<http://bloodgate.com/> in early 2002 - 2005.
+(C) by Tels L<http://bloodgate.com/> in early 2002 - 2007.
=cut