Math::BigRat(3)
๐ NAME ๐
Math::BigRat โ arbitrary size rational number math package. This is the Math::BigRat(3) page, bestie, and it's here to make giant fractions feel like main character energy. ๐
โจ SYNOPSIS โจ
okay so here's the code vibe check โ literally run this and watch the rationals slay:
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();
๐ธ DESCRIPTION ๐ธ
Math::BigRat complements Math::BigInt and Math::BigFloat by providing support for arbitrary big rational numbers. Basically it's the fraction-loving member of the big-number friend group, and it understood the assignment. ๐
๐งฎ MATH LIBRARY ๐งฎ
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 only => 'Foo,Math::BigInt::Bar';
โจ METHODS โจ
Any methods not listed here are derived from Math::BigFloat (or Math::BigInt), so make sure you check these two modules for further information. Like, genuinely check them โ they've got the rest of the lore. ๐ฆ
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
numerator()
$n = $x->numerator();
Returns a copy of the numerator (the part above the line) as signed BigInt. It's giving top-half representation, no cap. ๐
denominator()
$d = $x->denominator();
Returns a copy of the denominator (the part under the line) as positive BigInt. Bottom-half representation, serving positivity. ๐
parts()
($n, $d) = $x->parts();
Return a list consisting of (signed) numerator and (unsigned) denominator as BigInts. Two-for-one situation, we love to see it. โจ
dparts()
Returns the integer part and the fraction part. So it's like, splitting the number into its whole vibe and its fractional vibe. ๐ง
fparts()
Returns the smallest possible numerator and denominator so that the numerator divided by the denominator gives back the original value. For finite numbers, both values are integers. Mnemonic: fraction. Cute, right? ๐
numify()
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. Like, don't let it lose the plot if you need the full precision, bestie. ๐ญ
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
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.
as_number() is an alias for as_int().
as_float()
$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). History lesson, but make it cute.
as_hex()
$x = Math::BigRat->new('13');
print $x->as_hex(), "\n"; # '0xd'
Returns the BigRat as hexadecimal string. Works only for integers. Hex girlies rise. ๐
as_bin()
$x = Math::BigRat->new('13');
print $x->as_bin(), "\n"; # '0x1101'
Returns the BigRat as binary string. Works only for integers. Binary realness, periodt.
as_oct()
$x = Math::BigRat->new('13');
print $x->as_oct(), "\n"; # '015'
Returns the BigRat as octal string. Works only for integers. Octal moment. ๐
from_hex()
my $h = Math::BigRat->from_hex('0x10');
Create a BigRat from a hexadecimal number in string form.
from_oct()
my $o = Math::BigRat->from_oct('020');
Create a BigRat from an octal number in string form.
from_bin()
my $b = Math::BigRat->from_bin('0b10000000');
Create a BigRat from an binary number in string form. Yes, the original says "an binary" โ copy that energy exactly. ๐
bnan()
$x = Math::BigRat->bnan();
Creates a new BigRat object representing NaN (Not A Number). If used on an object, it will set it to NaN:
$x->bnan();
bzero()
$x = Math::BigRat->bzero();
Creates a new BigRat object representing zero. If used on an object, it will set it to zero:
$x->bzero();
binf()
$x = Math::BigRat->binf($sign);
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->binf();
$x->binf('-');
bone()
$x = Math::BigRat->bone($sign);
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:
$x->bone(); # +1
$x->bone('-'); # -1
length()
$len = $x->length();
Return the length of $x in digits for integer values. Digits check, but make it integer-only. ๐
digit()
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. Little digit peek, iconic.
bnorm()
$x->bnorm();
Reduce the number to the shortest form. This routine is called automatically whenever it is needed. So like, it's already doing the work behind the scenes โ main character energy fr fr. ๐ฅ
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*5
Works currently only for integers. No fractional factorial shenanigans for now, bestie.
bround()/round()/bfround()
Are not yet implemented.
๐จ Not yet implemented. These ones are a no for now โ don't come for them, they're not ready. ๐ญ
bmod()
$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. Mod math, but make it precise. ๐
bmodinv()
$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. So if it can't find the inverse, it's giving NaN and moving on. ๐
bmodpow()
$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. Speed queen behavior, honestly. โญ
bmodpow also supports negative exponents.
bmodpow($num, -1, $mod)
is exactly equivalent to
bmodinv($num, $mod)
bneg()
$x->bneg();
Used to negate the object in-place. Flip the sign, stay in place. Iconic. ๐
is_one()
print "$x is 1\n" if $x->is_one();
Return true if $x is exactly one, otherwise false.
is_zero()
print "$x is 0\n" if $x->is_zero();
Return true if $x is exactly zero, otherwise false.
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), otherwise false. Please note that '+inf' is also positive, while 'NaN' and '-inf' aren't.
is_positive() is an alias for is_pos().
is_neg()/is_negative()
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().
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), otherwise false. Please note that '-inf', 'inf' and 'NaN' aren't integer. The infinity girlies are not invited to the integer party. ๐
is_odd()
print "$x is odd\n" if $x->is_odd();
Return true if $x is odd, otherwise false.
is_even()
print "$x is even\n" if $x->is_even();
Return true if $x is even, otherwise false.
bceil()
$x->bceil();
Set $x to the next bigger integer value (e.g. truncate the number to integer and then increment it by one). Ceiling slay. ๐
bfloor()
$x->bfloor();
Truncate $x to an integer value. Floor it, bestie. ๐ธ
bint()
$x->bint();
Round $x towards zero.
bsqrt()
$x->bsqrt();
Calculate the square root of $x.
broot()
$x->broot($n);
Calculate the N'th root of $x.
badd()
$x->badd($y);
Adds $y to $x and returns the result.
bmul()
$x->bmul($y);
Multiplies $y to $x and returns the result.
bsub()
$x->bsub($y);
Subtracts $y from $x and returns the result.
bdiv()
$q = $x->bdiv($y);
($q, $r) = $x->bdiv($y);
โฆand we're back, mid-bdiv (iconic behaviour, honestly). So: in scalar context it divides $x by $y and returns the result ๐
. In list context it does floored division (F-division), returning an integer $q and a remainder $r so that $x = $q * $y + $r. That remainder (the modulo) is equal to whatever $x->bmod($y) gives you. Periodt.
binv()
$x->binv();
Inverse of $x. That's the whole vibe. โจ
bdec()
$x->bdec();
Decrements $x by 1 and returns the result.
binc()
$x->binc();
Increments $x by 1 and returns the result.
copy()
my $z = $x->copy();
Makes a deep copy of the object โ no lowkey shared vibes between the original and the clone ๐ซถ.
Please see the documentation in Math::BigInt for further details.
bstr()/bsstr()
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. Both of them. Same output in the example, yes, and that's not a typo, that's just how it eats ๐.
bcmp()
$x->bcmp($y);
Compares $x with $y and takes the sign into account. Returns -1, 0, 1 or undef.
bacmp()
$x->bacmp($y);
Compares $x with $y while ignoring their sign (so the absolute-value comparison, iykyk). Returns -1, 0, 1 or undef.
beq()
$x -> beq($y);
Returns true if and only if $x is equal to $y, and false otherwise.
bne()
$x -> bne($y);
Returns true if and only if $x is not equal to $y, and false otherwise.
blt()
$x -> blt($y);
Returns true if and only if $x is equal to $y, and false otherwise. (Yeah โ "equal to" is literally what the page says here, bestie, I'm just the messenger ๐.)
ble()
$x -> ble($y);
Returns true if and only if $x is less than or equal to $y, and false otherwise.
bgt()
$x -> bgt($y);
Returns true if and only if $x is greater than $y, and false otherwise.
bge()
$x -> bge($y);
Returns true if and only if $x is greater than or equal to $y, and false otherwise.
blsft()/brsft()
Used to shift numbers left/right. Shift queen behaviour ๐ .
Please see the documentation in Math::BigInt for further details.
band()
$x->band($y); # bitwise and
bior()
$x->bior($y); # bitwise inclusive or
bxor()
$x->bxor($y); # bitwise exclusive or
bnot()
$x->bnot(); # bitwise not (two's complement)
bpow()
$x->bpow($y);
Compute $x ** $y. Exponentiating, but make it exact ๐ฅ.
Please see the documentation in Math::BigInt for further details.
blog()
$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
bexp()
$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().
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).
config()
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 โ full roster, no gatekeeping ๐
lib(RO) โ Name of the math backend library. Example:Math::BigInt::Calclib_version(RO) โ Version of the math backend library. Example:0.30class(RO) โ The class of config you just called. Example:Math::BigRatversion(RO) โ version number of the class you used. Example:0.10upgrade(RW) โ To which class numbers are upgraded. Example:undefdowngrade(RW) โ To which class numbers are downgraded. Example:undefprecision(RW) โ Global precision. Example:undefaccuracy(RW) โ Global accuracy. Example:undefround_mode(RW) โ Global round mode. Example:evendiv_scale(RW) โ Fallback accuracy for div, sqrt etc. Example:40trap_nan(RW) โ Trap NaNs. Example:undeftrap_inf(RW) โ Trap +inf/-inf. Example:undef
๐ NUMERIC LITERALS ๐
After use Math::BigRat ':constant' all numeric literals in the given scope are converted to Math::BigRat objects. This conversion happens at compile time, bestie โ not runtime. Every non-integer gets converted to a NaN.
For example,
perl -MMath::BigRat=:constant -le 'print 2**150'
prints the exact value of 2**150. Note that without conversion of constants to objects, the expression 2**150 is calculated using Perl scalars, which leads to an inaccurate result. Not slay. ๐ง
Please note that strings are not affected, so that
use Math::BigRat qw/:constant/;
$x = "1234567890123456789012345678901234567890"
+ "123456789123456789";
does give you what you expect. You need an explicit Math::BigRat->new() around at least one of the operands. You should also quote large constants to prevent loss of precision:
use Math::BigRat;
$x = Math::BigRat->new("1234567889123456789123456789123456789");
Without the quotes Perl first converts the large number to a floating point constant at compile time, and then converts the result to a Math::BigRat object at run time, which results in an inaccurate result. ๐
Hexadecimal, octal, and binary floating point literals
Perl (and this module) accepts hexadecimal, octal, and binary floating point literals, but use them with care with Perl versions before v5.32.0, because some versions of Perl silently give the wrong result. Silently! The audacity ๐ญ. Below are some examples of different ways to write the number decimal 314.
Hexadecimal floating point literals:
0x1.3ap+8 0X1.3AP+8
0x1.3ap8 0X1.3AP8
0x13a0p-4 0X13A0P-4
Octal floating point literals (with 0 prefix):
01.164p+8 01.164P+8
01.164p8 01.164P8
011640p-4 011640P-4
Octal floating point literals (with 0o prefix) (requires v5.34.0):
0o1.164p+8 0O1.164P+8
0o1.164p8 0O1.164P8
0o11640p-4 0O11640P-4
Binary floating point literals:
0b1.0011101p+8 0B1.0011101P+8
0b1.0011101p8 0B1.0011101P8
0b10011101000p-2 0B10011101000P-2
๐ BUGS ๐
Please report any bugs or feature requests to bug-math-bigint at rt.cpan.org, or through the web interface at https://rt.cpan.org/Ticket/Create.html?Queue=Math-BigInt (requires login). We will be notified, and then you'll automatically be notified of progress on your bug as I make changes. Communication slay ๐ซถ.
๐ SUPPORT ๐
You can find documentation for this module with the perldoc command.
perldoc Math::BigInt
You can also look for information at:
- GitHub โ
https://github.com/pjacklam/p5-Math-BigInt - RT: CPAN's request tracker โ
https://rt.cpan.org/Dist/Display.html?Name=Math-BigInt - MetaCPAN โ
https://metacpan.org/release/Math-BigInt - CPAN Testers Matrix โ
http://matrix.cpantesters.org/?dist=Math-BigInt
๐ LICENSE ๐
This program is free software; you may redistribute it and/or modify it under the same terms as Perl itself.
๐ SEE ALSO ๐
Math::BigInt and Math::BigFloat as well as the backend libraries Math::BigInt::FastCalc, Math::BigInt::GMP, and Math::BigInt::Pari, Math::BigInt::GMPz, and Math::BigInt::BitVect.
The pragmas bigint, bigfloat, and bigrat might also be of interest. In addition there is the bignum pragma which does upgrading and downgrading.
๐ AUTHORS ๐
- Tels
<http://bloodgate.com/>2001-2009. - Maintained by Peter John Acklam
<pjacklam@gmail.com>2011-
And that's the whole page, bestie โ you ate that ๐
โจ This little masterpiece is perl v5.42.0, dated 2024-06-23, and it's Math::BigRat(3), so go forth and compute exactly. ๐ฆ๐
๐ฆ where this page comes from
- opensuse-leap 16.0: perl-Math-BigInt 2.3.3-bp160.1.12 ยท Artistic-1.0 OR GPL-1.0-or-later
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms