Math::BigRat - Arbitrary big rational numbers
| Use Case | Command | Description |
|---|---|---|
| Create a rational | $x = Math::BigRat->new('3/7'); | Create a new BigRat from a fraction string |
| Add fractions | $x += '5/9'; | Add a rational number using overloaded operators |
| Convert to integer | $x->as_int(); | Truncate to integer as BigInt |
| Convert to float | $x->as_float($digits); | Convert to BigFloat with specified accuracy |
| Compare | $x->bcmp($y); | Compare signed values (-1,0,1) |
| Modular inverse | $x->bmodinv($mod); | Multiplicative inverse modulo $mod |
| Square root | $x->bsqrt(); | Compute square root |
| Factorial | $x->bfac(); | Compute factorial (integer only) |
| Check if zero | $x->is_zero(); | Test for zero |
| Set precision | Math::BigRat->config('accuracy', 50); | Set global accuracy |
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();
Math::BigRat complements Math::BigInt and Math::BigFloat by providing support for arbitrary big rational numbers.
You can change the underlying module that does the low-level math 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, then Math::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 'Foo,Math::BigInt::Bar';
Any methods not listed here are derived from Math::BigFloat (or Math::BigInt), so make sure you check these two modules for further information.
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
$n = $x->numerator();
Returns a copy of the numerator (the part above the line) as signed BigInt.
$d = $x->denominator();
Returns a copy of the denominator (the part under the line) as positive BigInt.
($n, $d) = $x->parts();
Return a list consisting of (signed) numerator and (unsigned) denominator as BigInts.
my $y = $x->numify();
Returns the object as a scalar. This will lose some data if the object cannot be represented by a normal Perl scalar (integer or float), so use "as_int()" or "as_float()" instead.
This routine is automatically used whenever a scalar is required:
my $x = Math::BigRat->new('3/1');
@array = (0, 1, 2, 3);
$y = $array[$x]; # set $y to 3
$x = Math::BigRat->new('13/7');
print $x->as_int(), "\n"; # '1'
Returns a copy of the object as BigInt, truncated to an integer.
"as_number()" is an alias for "as_int()".
$x = Math::BigRat->new('13/7');
print $x->as_float(), "\n"; # '1'
$x = Math::BigRat->new('2/3');
print $x->as_float(5), "\n"; # '0.66667'
Returns a copy of the object as BigFloat, preserving the accuracy as wanted, or the default of 40 digits.
This method was added in v0.22 of Math::BigRat (April 2008).
$x = Math::BigRat->new('13');
print $x->as_hex(), "\n"; # '0xd'
Returns the BigRat as hexadecimal string. Works only for integers.
$x = Math::BigRat->new('13');
print $x->as_bin(), "\n"; # '0x1101'
Returns the BigRat as binary string. Works only for integers.
$x = Math::BigRat->new('13');
print $x->as_oct(), "\n"; # '015'
Returns the BigRat as octal string. Works only for integers.
my $h = Math::BigRat->from_hex('0x10');
Create a BigRat from a hexadecimal number in string form.
my $o = Math::BigRat->from_oct('020');
Create a BigRat from an octal number in string form.
my $b = Math::BigRat->from_bin('0b10000000');
Create a BigRat from an binary number in string form.
$x = Math::BigRat->bnan();
$x->bnan();
Creates a new BigRat object representing NaN (Not A Number). If used on an object, it will set it to NaN.
$x = Math::BigRat->bzero();
$x->bzero();
Creates a new BigRat object representing zero. If used on an object, it will set it to zero.
$x = Math::BigRat->binf($sign);
$x->binf();
$x->binf('-');
Creates a new BigRat object representing infinity. The optional argument is either '-' or '+', indicating whether you want infinity or minus infinity. If used on an object, it will set it to infinity.
$x = Math::BigRat->bone($sign);
$x->bone(); # +1
$x->bone('-'); # -1
Creates a new BigRat object representing one. The optional argument is either '-' or '+', indicating whether you want one or minus one. If used on an object, it will set it to one.
$len = $x->length();
Return the length of $x in digits for integer values.
print Math::BigRat->new('123/1')->digit(1); # 1
print Math::BigRat->new('123/1')->digit(-1); # 3
Return the N'ths digit from X when X is an integer value.
$x->bnorm();
Reduce the number to the shortest form. This routine is called automatically whenever it is needed.
$x->bfac();
print Math::BigRat->new('3/1')->bfac(), "\n"; # 1*2*3
print Math::BigRat->new('5/1')->bfac(), "\n"; # 1*2*3*4*5
Calculates the factorial of $x. Works currently only for integers.
Are not yet implemented.
$x->bmod($y);
Returns $x modulo $y. When $x is finite, and $y is finite and non-zero, the result is identical to the remainder after floored division (F-division). If, in addition, both $x and $y are integers, the result is identical to the result from Perl's % operator.
$x->bmodinv($mod); # modular multiplicative inverse
Returns the multiplicative inverse of $x modulo $mod. If
$y = $x -> copy() -> bmodinv($mod)
then $y is the number closest to zero, and with the same sign as $mod, satisfying
($x * $y) % $mod = 1 % $mod
If $x and $y are non-zero, they must be relative primes, i.e., "bgcd($y, $mod)==1". '"NaN"' is returned when no modular multiplicative inverse exists.
$num->bmodpow($exp,$mod); # modular exponentiation
# ($num**$exp % $mod)
Returns the value of $num taken to the power $exp in the modulus $mod using binary exponentiation. "bmodpow" is far superior to writing
$num ** $exp % $mod
because it is much faster - it reduces internal variables into the modulus whenever possible, so it operates on smaller numbers.
"bmodpow" also supports negative exponents.
bmodpow($num, -1, $mod)
is exactly equivalent to
bmodinv($num, $mod)
$x->bneg();
Used to negate the object in-place.
print "$x is 1\n" if $x->is_one();
Return true if $x is exactly one, otherwise false.
print "$x is 0\n" if $x->is_zero();
Return true if $x is exactly zero, otherwise false.
print "$x is >= 0\n" if $x->is_positive();
Return true if $x is positive (greater than or equal to zero), otherwise false. Please note that '+inf' is also positive, while 'NaN' and '-inf' aren't.
"is_positive()" is an alias for "is_pos()".
print "$x is < 0\n" if $x->is_negative();
Return true if $x is negative (smaller than zero), otherwise false. Please note that '-inf' is also negative, while 'NaN' and '+inf' aren't.
"is_negative()" is an alias for "is_neg()".
print "$x is an integer\n" if $x->is_int();
Return true if $x has a denominator of 1 (e.g. no fraction parts), otherwise false. Please note that '-inf', 'inf' and 'NaN' aren't integer.
print "$x is odd\n" if $x->is_odd();
Return true if $x is odd, otherwise false.
print "$x is even\n" if $x->is_even();
Return true if $x is even, otherwise false.
$x->bceil();
Set $x to the next bigger integer value (e.g. truncate the number to integer and then increment it by one).
$x->bfloor();
Truncate $x to an integer value.
$x->bint();
Round $x towards zero.
$x->bsqrt();
Calculate the square root of $x.
$x->broot($n);
Calculate the N'th root of $x.
$x->badd($y);
Adds $y to $x and returns the result.
$x->bmul($y);
Multiplies $y to $x and returns the result.
$x->bsub($y);
Subtracts $y from $x and returns the result.
$q = $x->bdiv($y);
($q, $r) = $x->bdiv($y);
In scalar context, divides $x by $y and returns the result. In list context, does floored division (F-division), returning an integer $q and a remainder $r so that $x = $q * $y + $r. The remainer (modulo) is equal to what is returned by "$x->bmod($y)".
$x->bdec();
Decrements $x by 1 and returns the result.
$x->binc();
Increments $x by 1 and returns the result.
my $z = $x->copy();
Makes a deep copy of the object.
Please see the documentation in Math::BigInt for further details.
my $x = Math::BigRat->new('8/4');
print $x->bstr(), "\n"; # prints 1/2
print $x->bsstr(), "\n"; # prints 1/2
Return a string representing this object.
$x->bcmp($y);
Compares $x with $y and takes the sign into account. Returns -1, 0, 1 or undef.
$x->bacmp($y);
Compares $x with $y while ignoring their sign. Returns -1, 0, 1 or undef.
$x -> beq($y);
Returns true if and only if $x is equal to $y, and false otherwise.
$x -> bne($y);
Returns true if and only if $x is not equal to $y, and false otherwise.
$x -> blt($y);
Returns true if and only if $x is equal to $y, and false otherwise.
$x -> ble($y);
Returns true if and only if $x is less than or equal to $y, and false otherwise.
$x -> bgt($y);
Returns true if and only if $x is greater than $y, and false otherwise.
$x -> bge($y);
Returns true if and only if $x is greater than or equal to $y, and false otherwise.
Used to shift numbers left/right.
Please see the documentation in Math::BigInt for further details.
$x->band($y); # bitwise and
$x->bior($y); # bitwise inclusive or
$x->bxor($y); # bitwise exclusive or
$x->bnot(); # bitwise not (two's complement)
$x->bpow($y);
Compute $x ** $y.
Please see the documentation in Math::BigInt for further details.
$x->blog($base, $accuracy); # logarithm of x to the base $base
If $base is not defined, Euler's number (e) is used:
print $x->blog(undef, 100); # log(x) to 100 digits
$x->bexp($accuracy); # calculate e ** X
Calculates two integers A and B so that A/B is equal to "e ** $x", where "e" is Euler's number.
This method was added in v0.20 of Math::BigRat (May 2007).
See also "blog()".
$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).
Math::BigRat->config("trap_nan" => 1); # set
$accu = Math::BigRat->config("accuracy"); # get
Set or get configuration parameter values. Read-only parameters are marked as RO. Read-write parameters are marked as RW. The following parameters are supported.
| Parameter | RO/RW | Description | Example |
|---|---|---|---|
| ๐ lib | RO | Name of the math backend library | Math::BigInt::Calc |
| ๐ท๏ธ lib_version | RO | Version of the math backend library | 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, sqrt etc. | 40 |
| โ ๏ธ trap_nan | RW | Trap NaNs | undef |
| โ ๏ธ trap_inf | RW | Trap +inf/-inf | undef |
Please report any bugs or feature requests to "bug-math-bigrat at rt.cpan.org", or through the web interface at <https://rt.cpan.org/Ticket/Create.html?Queue=Math-BigRat> (requires login). We will be notified, and then you'll automatically be notified of progress on your bug as I make changes.
You can find documentation for this module with the perldoc command.
perldoc Math::BigRat
You can also look for information at:
This program is free software; you may redistribute it and/or modify it under the same terms as Perl itself.
bigrat, Math::BigFloat and Math::BigInt as well as the backends Math::BigInt::FastCalc, Math::BigInt::GMP, and Math::BigInt::Pari.
Generated by phpman v4.9.29 · Markdown · JSON · MCP Author: Che Dong Under GNU General Public License
2026-07-21 00:05 @2600:1f28:365:80b0:d8a5:c3c6:bf94:28c0
CrawledBy CCBot/2.0 (https://commoncrawl.org/faq/)
Enhanced by LLM: deepseek-v4-flash / taotoken.net / www.chedong.com - original format