📄 bigrat.pm
字号:
{ my $self = shift; my $l = scalar @_; my $lib = ''; my @a; my $try = 'try'; for ( my $i = 0; $i < $l ; $i++) { if ( $_[$i] eq ':constant' ) { # this rest causes overlord er load to step in overload::constant float => sub { $self->new(shift); }; }# elsif ($_[$i] eq 'upgrade')# {# # this causes upgrading# $upgrade = $_[$i+1]; # or undef to disable# $i++;# } elsif ($_[$i] eq 'downgrade') { # this causes downgrading $downgrade = $_[$i+1]; # or undef to disable $i++; } elsif ($_[$i] =~ /^(lib|try|only)\z/) { $lib = $_[$i+1] || ''; # default Calc $try = $1; # lib, try or only $i++; } elsif ($_[$i] eq 'with') { # this argument is no longer used #$MBI = $_[$i+1] || 'Math::BigInt::Calc'; # default Math::BigInt::Calc $i++; } else { push @a, $_[$i]; } } require Math::BigInt; # let use Math::BigInt lib => 'GMP'; use Math::BigRat; still have GMP if ($lib ne '') { my @c = split /\s*,\s*/, $lib; foreach (@c) { $_ =~ tr/a-zA-Z0-9://cd; # limit to sane characters } $lib = join(",", @c); } my @import = ('objectify'); push @import, $try => $lib if $lib ne ''; # MBI already loaded, so feed it our lib arguments Math::BigInt->import( @import ); $MBI = Math::BigFloat->config()->{lib}; # register us with MBI to get notified of future lib changes Math::BigInt::_register_callback( $self, sub { $MBI = $_[0]; } ); # any non :constant stuff is handled by our parent, Exporter (loaded # by Math::BigFloat, even if @_ is empty, to give it a chance $self->SUPER::import(@a); # for subclasses $self->export_to_level(1,$self,@a); # need this, too }1;__END__=head1 NAMEMath::BigRat - Arbitrary big rational numbers=head1 SYNOPSIS use Math::BigRat; my $x = Math::BigRat->new('3/7'); $x += '5/9'; print $x->bstr(),"\n"; print $x ** 2,"\n"; my $y = Math::BigRat->new('inf'); print "$y ", ($y->is_inf ? 'is' : 'is not') , " infinity\n"; my $z = Math::BigRat->new(144); $z->bsqrt();=head1 DESCRIPTIONMath::BigRat complements Math::BigInt and Math::BigFloat by providing supportfor arbitrary big rational numbers.=head2 MATH LIBRARYYou can change the underlying module that does the low-levelmath operations by using: use Math::BigRat try => 'GMP';Note: This needs Math::BigInt::GMP installed.The following would first try to find Math::BigInt::Foo, thenMath::BigInt::Bar, and when this also fails, revert to Math::BigInt::Calc: use Math::BigRat try => 'Foo,Math::BigInt::Bar';If you want to get warned when the fallback occurs, replace "try" with"lib": use Math::BigRat lib => 'Foo,Math::BigInt::Bar';If you want the code to die instead, replace "try" with"only": use Math::BigRat only => 'Foo,Math::BigInt::Bar';=head1 METHODSAny methods not listed here are derived from Math::BigFloat (orMath::BigInt), so make sure you check these two modules for furtherinformation.=head2 new() $x = Math::BigRat->new('1/3');Create a new Math::BigRat object. Input can come in various forms: $x = Math::BigRat->new(123); # scalars $x = Math::BigRat->new('inf'); # infinity $x = Math::BigRat->new('123.3'); # float $x = Math::BigRat->new('1/3'); # simple string $x = Math::BigRat->new('1 / 3'); # spaced $x = Math::BigRat->new('1 / 0.1'); # w/ floats $x = Math::BigRat->new(Math::BigInt->new(3)); # BigInt $x = Math::BigRat->new(Math::BigFloat->new('3.1')); # BigFloat $x = Math::BigRat->new(Math::BigInt::Lite->new('2')); # BigLite # You can also give D and N as different objects: $x = Math::BigRat->new( Math::BigInt->new(-123), Math::BigInt->new(7), ); # => -123/7=head2 numerator() $n = $x->numerator();Returns a copy of the numerator (the part above the line) as signed BigInt.=head2 denominator() $d = $x->denominator();Returns a copy of the denominator (the part under the line) as positive BigInt.=head2 parts() ($n,$d) = $x->parts();Return a list consisting of (signed) numerator and (unsigned) denominator asBigInts.=head2 numify() my $y = $x->numify();Returns the object as a scalar. This will lose some data if the objectcannot be represented by a normal Perl scalar (integer or float), souse as_int() instead.This routine is automatically used whenever a scalar is required: my $x = Math::BigRat->new('3/1'); @array = (1,2,3); $y = $array[$x]; # set $y to 3=head2 as_int()/as_number() $x = Math::BigRat->new('13/7'); print $x->as_int(),"\n"; # '1'Returns a copy of the object as BigInt, truncated to an integer.C<as_number()> is an alias for C<as_int()>.=head2 as_hex() $x = Math::BigRat->new('13'); print $x->as_hex(),"\n"; # '0xd'Returns the BigRat as hexadecimal string. Works only for integers. =head2 as_bin() $x = Math::BigRat->new('13'); print $x->as_bin(),"\n"; # '0x1101'Returns the BigRat as binary string. Works only for integers. =head2 as_oct() $x = Math::BigRat->new('13'); print $x->as_oct(),"\n"; # '015'Returns the BigRat as octal string. Works only for integers. =head2 from_hex()/from_bin()/from_oct() my $h = Math::BigRat->from_hex('0x10'); my $b = Math::BigRat->from_bin('0b10000000'); my $o = Math::BigRat->from_oct('020');Create a BigRat from an hexadecimal, binary or octal numberin string form.=head2 length() $len = $x->length();Return the length of $x in digitis for integer values.=head2 digit() print Math::BigRat->new('123/1')->digit(1); # 1 print Math::BigRat->new('123/1')->digit(-1); # 3Return the N'ths digit from X when X is an integer value.=head2 bnorm() $x->bnorm();Reduce the number to the shortest form. This routine is calledautomatically whenever it is needed.=head2 bfac() $x->bfac();Calculates the factorial of $x. For instance: print Math::BigRat->new('3/1')->bfac(),"\n"; # 1*2*3 print Math::BigRat->new('5/1')->bfac(),"\n"; # 1*2*3*4*5Works currently only for integers.=head2 bround()/round()/bfround()Are not yet implemented.=head2 bmod() use Math::BigRat; my $x = Math::BigRat->new('7/4'); my $y = Math::BigRat->new('4/3'); print $x->bmod($y);Set $x to the remainder of the division of $x by $y.=head2 bneg() $x->bneg();Used to negate the object in-place.=head2 is_one() print "$x is 1\n" if $x->is_one();Return true if $x is exactly one, otherwise false.=head2 is_zero() print "$x is 0\n" if $x->is_zero();Return true if $x is exactly zero, otherwise false.=head2 is_pos()/is_positive() print "$x is >= 0\n" if $x->is_positive();Return true if $x is positive (greater than or equal to zero), otherwisefalse. Please note that '+inf' is also positive, while 'NaN' and '-inf' aren't.C<is_positive()> is an alias for C<is_pos()>.=head2 is_neg()/is_negative() print "$x is < 0\n" if $x->is_negative();Return true if $x is negative (smaller than zero), otherwise false. Pleasenote that '-inf' is also negative, while 'NaN' and '+inf' aren't.C<is_negative()> is an alias for C<is_neg()>.=head2 is_int() print "$x is an integer\n" if $x->is_int();Return true if $x has a denominator of 1 (e.g. no fraction parts), otherwisefalse. Please note that '-inf', 'inf' and 'NaN' aren't integer.=head2 is_odd() print "$x is odd\n" if $x->is_odd();Return true if $x is odd, otherwise false.=head2 is_even() print "$x is even\n" if $x->is_even();Return true if $x is even, otherwise false.=head2 bceil() $x->bceil();Set $x to the next bigger integer value (e.g. truncate the number to integerand then increment it by one).=head2 bfloor() $x->bfloor();Truncate $x to an integer value.=head2 bsqrt() $x->bsqrt();Calculate the square root of $x.=head2 broot() $x->broot($n);Calculate the N'th root of $x.=head2 badd()/bmul()/bsub()/bdiv()/bdec()/binc()Please see the documentation in L<Math::BigInt>.=head2 copy() my $z = $x->copy();Makes a deep copy of the object.Please see the documentation in L<Math::BigInt> for further details.=head2 bstr()/bsstr() my $x = Math::BigInt->new('8/4'); print $x->bstr(),"\n"; # prints 1/2 print $x->bsstr(),"\n"; # prints 1/2Return a string representating this object.=head2 bacmp()/bcmp()Used to compare numbers.Please see the documentation in L<Math::BigInt> for further details.=head2 blsft()/brsft()Used to shift numbers left/right.Please see the documentation in L<Math::BigInt> for further details.=head2 bpow() $x->bpow($y);Compute $x ** $y.Please see the documentation in L<Math::BigInt> for further details.=head2 bexp() $x->bexp($accuracy); # calculate e ** XCalculates two integers A and B so that A/B is equal to C<e ** $x>, where C<e> isEuler's number.This method was added in v0.20 of Math::BigRat (May 2007).See also L<blog()>.=head2 bnok() $x->bnok($y); # x over y (binomial coefficient n over k)Calculates the binomial coefficient n over k, also called the "choose"function. The result is equivalent to: ( n ) n! | - | = ------- ( k ) k!(n-k)!This method was added in v0.20 of Math::BigRat (May 2007).=head2 config() use Data::Dumper; print Dumper ( Math::BigRat->config() ); print Math::BigRat->config()->{lib},"\n";Returns a hash containing the configuration, e.g. the version number, libloaded etc. The following hash keys are currently filled in with theappropriate information. key RO/RW Description Example ============================================================ lib RO Name of the Math library Math::BigInt::Calc lib_version RO Version of 'lib' 0.30 class RO The class of config you just called Math::BigRat version RO version number of the class you used 0.10 upgrade RW To which class numbers are upgraded undef downgrade RW To which class numbers are downgraded undef precision RW Global precision undef accuracy RW Global accuracy undef round_mode RW Global round mode even div_scale RW Fallback accuracy for div 40 trap_nan RW Trap creation of NaN (undef = no) undef trap_inf RW Trap creation of +inf/-inf (undef = no) undefBy passing a reference to a hash you may set the configuration values. Thisworks only for values that a marked with a C<RW> above, anything else isread-only.=head1 BUGSSome things are not yet implemented, or only implemented half-way:=over 2=item inf handling (partial)=item NaN handling (partial)=item rounding (not implemented except for bceil/bfloor)=item $x ** $y where $y is not an integer=item bmod(), blog(), bmodinv() and bmodpow() (partial)=back=head1 LICENSEThis program is free software; you may redistribute it and/or modify it underthe same terms as Perl itself.=head1 SEE ALSOL<Math::BigFloat> and L<Math::Big> as well as L<Math::BigInt::BitVect>,L<Math::BigInt::Pari> and L<Math::BigInt::GMP>.See L<http://search.cpan.org/search?dist=bignum> for a way to useMath::BigRat.The package at L<http://search.cpan.org/search?dist=Math%3A%3ABigRat>may contain more documentation and examples as well as testcases.=head1 AUTHORS(C) by Tels L<http://bloodgate.com/> 2001 - 2007.=cut
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -