Math::BigRat - 任意大小有理數數學套件
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 補足了 Math::BigInt 和 Math::BigFloat,提供了對任意大有理數的支援。
你可以使用下列方式變更執行低階數學運算的底層模組
use Math::BigRat try => 'GMP';
注意:這需要安裝 Math::BigInt::GMP。
下列程式碼會先嘗試尋找 Math::BigInt::Foo,接著是 Math::BigInt::Bar,如果也失敗,則改用 Math::BigInt::Calc
use Math::BigRat try => 'Foo,Math::BigInt::Bar';
如果你希望在發生備援時收到警告,請將「try」替換為「lib」
use Math::BigRat lib => 'Foo,Math::BigInt::Bar';
如果你希望程式碼中斷,請將「try」替換為「only」
use Math::BigRat only => 'Foo,Math::BigInt::Bar';
在此未列出的任何方法皆衍生自 Math::BigFloat(或 Math::BigInt),因此請務必查看這兩個模組以取得更多資訊。
$x = Math::BigRat->new('1/3');
建立新的 Math::BigRat 物件。輸入可以採用各種形式
$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();
傳回分子(線條上方的部分)的副本,為有符號 BigInt。
$d = $x->denominator();
傳回分母(線條下方的部分)的副本,為正 BigInt。
($n, $d) = $x->parts();
傳回一個清單,包含(有符號)分子和(無符號)分母,為 BigInt。
傳回整數部分和小數部分。
傳回最小的分子和分母,分子除以分母會得到原始值。對於有限數字,兩個值都是整數。助記符:小數。
my $y = $x->numify();
傳回物件作為純量。如果物件無法以一般 Perl 純量(整數或浮點數)表示,則會遺失一些資料,因此請改用 "as_int()" 或 "as_float()"。
每當需要純量時,就會自動使用此常式
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'
傳回物件的副本,為 BigInt,截斷為整數。
as_number()
是 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'
傳回物件的副本,為 BigFloat,保留所需的準確度,或預設的 40 個位數。
此方法已新增至 Math::BigRat 的 v0.22(2008 年 4 月)。
$x = Math::BigRat->new('13');
print $x->as_hex(), "\n"; # '0xd'
傳回 BigRat 作為十六進位字串。僅適用於整數。
$x = Math::BigRat->new('13');
print $x->as_bin(), "\n"; # '0x1101'
傳回 BigRat 作為二進位字串。僅適用於整數。
$x = Math::BigRat->new('13');
print $x->as_oct(), "\n"; # '015'
將 BigRat 回傳為八進位字串。僅適用於整數。
my $h = Math::BigRat->from_hex('0x10');
從字串形式的十六進位數字建立 BigRat。
my $o = Math::BigRat->from_oct('020');
從字串形式的八進位數字建立 BigRat。
my $b = Math::BigRat->from_bin('0b10000000');
從字串形式的二進位數字建立 BigRat。
$x = Math::BigRat->bnan();
建立新的 BigRat 物件,代表 NaN(非數字)。如果用於物件,它會將其設定為 NaN
$x->bnan();
$x = Math::BigRat->bzero();
建立新的 BigRat 物件,代表零。如果用於物件,它會將其設定為零
$x->bzero();
$x = Math::BigRat->binf($sign);
建立新的 BigRat 物件,代表無限大。選用引數為 '-' 或 '+',表示您要正無限大或負無限大。如果用於物件,它會將其設定為無限大
$x->binf();
$x->binf('-');
$x = Math::BigRat->bone($sign);
建立新的 BigRat 物件,代表一。選用引數為 '-' 或 '+',表示您要一或負一。如果用於物件,它會將其設定為一
$x->bone(); # +1
$x->bone('-'); # -1
$len = $x->length();
傳回整數值中 $x 的長度(以位數為單位)。
print Math::BigRat->new('123/1')->digit(1); # 1
print Math::BigRat->new('123/1')->digit(-1); # 3
當 X 為整數值時,傳回 X 中第 N 個位數。
$x->bnorm();
將數字簡化為最短形式。此常式會在需要時自動呼叫。
$x->bfac();
計算 $x 的階乘。例如
print Math::BigRat->new('3/1')->bfac(), "\n"; # 1*2*3
print Math::BigRat->new('5/1')->bfac(), "\n"; # 1*2*3*4*5
目前僅適用於整數。
尚未實作。
$x->bmod($y);
傳回 $x 除以 $y 的餘數。當 $x 為有限值,且 $y 為有限且非零的值時,結果與取整除法(F 除法)後的餘數相同。此外,如果 $x 和 $y 都是整數,結果與 Perl 的 % 算子結果相同。
$x->bmodinv($mod); # modular multiplicative inverse
傳回 $x
除以 $mod
的乘法反元素。如果
$y = $x -> copy() -> bmodinv($mod)
則 $y
是最接近於零,且與 $mod
符號相同的數字,符合
($x * $y) % $mod = 1 % $mod
如果 $x
和 $y
為非零值,它們必須是相對質數,亦即 bgcd($y, $mod)==1
。如果不存在模乘法反元素,則傳回「NaN
」。
$num->bmodpow($exp,$mod); # modular exponentiation
# ($num**$exp % $mod)
使用二進制指數運算,傳回 $num
取 $exp
次方,模數為 $mod
的值。bmodpow
遠比寫
$num ** $exp % $mod
好得多,因為它快很多 - 它會在可能的情況下將內部變數化簡為模數,因此它作用於較小的數字上。
bmodpow
也支援負指數。
bmodpow($num, -1, $mod)
完全等於
bmodinv($num, $mod)
$x->bneg();
用於否定物件本身。
print "$x is 1\n" if $x->is_one();
如果 $x 等於一,傳回 true,否則傳回 false。
print "$x is 0\n" if $x->is_zero();
如果 $x 等於零,傳回 true,否則傳回 false。
print "$x is >= 0\n" if $x->is_positive();
如果 $x 為正數(大於或等於零),傳回 true,否則傳回 false。請注意,'+inf' 也是正數,而 'NaN' 和 '-inf' 不是。
is_positive()
是 is_pos()
的別名。
print "$x is < 0\n" if $x->is_negative();
如果 $x 為負數(小於零),傳回 true,否則傳回 false。請注意,'-inf' 也是負數,而 'NaN' 和 '+inf' 不是。
is_negative()
是 is_neg()
的別名。
print "$x is an integer\n" if $x->is_int();
如果 $x 的分母為 1(例如沒有小數部分),傳回 true,否則傳回 false。請注意,'-inf'、'inf' 和 'NaN' 不是整數。
print "$x is odd\n" if $x->is_odd();
如果 $x 為奇數,傳回 true,否則傳回 false。
print "$x is even\n" if $x->is_even();
如果 $x 為偶數,傳回 true,否則傳回 false。
$x->bceil();
將 $x 設定為下一個較大的整數值(例如將數字截斷為整數,然後增加一)。
$x->bfloor();
將 $x 截斷為整數值。
$x->bint();
將 $x 四捨五入為零。
$x->bsqrt();
計算 $x 的平方根。
$x->broot($n);
計算 $x 的 N 次方根。
$x->badd($y);
將 $y 加到 $x 並傳回結果。
$x->bmul($y);
將 $y 乘以 $x 並傳回結果。
$x->bsub($y);
將 $y 從 $x 減去並傳回結果。
$q = $x->bdiv($y);
($q, $r) = $x->bdiv($y);
在純量內容中,將 $x 除以 $y 並傳回結果。在清單內容中,執行取整除法(F 除法),傳回整數 $q 和餘數 $r,使得 $x = $q * $y + $r。餘數(模數)等於 $x->bmod($y)
所傳回的值。
$x->binv();
$x 的反函數。
$x->bdec();
將 $x 減 1 並傳回結果。
$x->binc();
將 $x 加 1 並傳回結果。
my $z = $x->copy();
建立物件的深度拷貝。
請參閱 Math::BigInt 中的文件以取得更多詳細資訊。
my $x = Math::BigRat->new('8/4');
print $x->bstr(), "\n"; # prints 1/2
print $x->bsstr(), "\n"; # prints 1/2
傳回代表此物件的字串。
$x->bcmp($y);
將 $x 與 $y 比較,並考量符號。傳回 -1、0、1 或 undef。
$x->bacmp($y);
將 $x 與 $y 比較,同時忽略其符號。傳回 -1、0、1 或 undef。
$x -> beq($y);
僅當 $x 等於 $y 時傳回 true,否則傳回 false。
$x -> bne($y);
僅當 $x 不等於 $y 時傳回 true,否則傳回 false。
$x -> blt($y);
僅當 $x 等於 $y 時傳回 true,否則傳回 false。
$x -> ble($y);
僅當 $x 小於或等於 $y 時傳回 true,否則傳回 false。
$x -> bgt($y);
僅當 $x 大於 $y 時傳回 true,否則傳回 false。
$x -> bge($y);
僅當 $x 大於或等於 $y 時傳回 true,否則傳回 false。
用於將數字向左/右移位。
請參閱 Math::BigInt 中的文件以取得更多詳細資訊。
$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);
計算 $x ** $y。
請參閱 Math::BigInt 中的文件以取得更多詳細資訊。
$x->blog($base, $accuracy); # logarithm of x to the base $base
如果未定義 $base
,則使用歐拉數 (e)
print $x->blog(undef, 100); # log(x) to 100 digits
$x->bexp($accuracy); # calculate e ** X
計算兩個整數 A 和 B,使得 A/B 等於 e ** $x
,其中 e
是歐拉數。
此方法已在 Math::BigRat 的 v0.20 中新增 (2007 年 5 月)。
另請參閱 blog()
。
$x->bnok($y); # x over y (binomial coefficient n over k)
計算 n 選 k 的二項式係數,也稱為「選擇」函數。結果等於
( n ) n!
| - | = -------
( k ) k!(n-k)!
此方法已在 Math::BigRat 的 v0.20 中新增 (2007 年 5 月)。
Math::BigRat->config("trap_nan" => 1); # set
$accu = Math::BigRat->config("accuracy"); # get
設定或取得組態參數值。唯讀參數標示為 RO。讀寫參數標示為 RW。支援下列參數。
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
在 use Math::BigRat ':constant'
之後,給定範圍內的所有數字文字都會轉換成 Math::BigRat
物件。此轉換會在編譯時發生。每個非整數都會轉換成 NaN。
例如,
perl -MMath::BigRat=:constant -le 'print 2**150'
會列印 2**150
的確切值。請注意,如果不將常數轉換成物件,則會使用 Perl 純量計算 2**150
的運算式,這會導致不準確的結果。
請注意,字串不會受到影響,因此
use Math::BigRat qw/:constant/;
$x = "1234567890123456789012345678901234567890"
+ "123456789123456789";
會提供您預期的結果。您需要在至少一個運算元周圍加上明確的 Math::BigRat->new()。您也應該引用大型常數,以防止精度遺失
use Math::BigRat;
$x = Math::BigRat->new("1234567889123456789123456789123456789");
如果不加上引號,Perl 會在編譯時先將大型數字轉換成浮點常數,然後在執行時將結果轉換成 Math::BigRat 物件,這會導致不準確的結果。
Perl (和此模組) 接受十六進位、八進位和二進位浮點文字,但在 v5.32.0 之前的 Perl 版本中使用時請小心,因為某些版本的 Perl 會在不提示的情況下提供錯誤的結果。以下是撰寫數字小數 314 的不同方式的一些範例。
十六進位浮點文字
0x1.3ap+8 0X1.3AP+8
0x1.3ap8 0X1.3AP8
0x13a0p-4 0X13A0P-4
八進位浮點文字 (加上「0」前綴)
01.164p+8 01.164P+8
01.164p8 01.164P8
011640p-4 011640P-4
八進位浮點數字面(帶有「0o」前綴)(需要 v5.34.0)
0o1.164p+8 0O1.164P+8
0o1.164p8 0O1.164P8
0o11640p-4 0O11640P-4
二進位浮點數字面
0b1.0011101p+8 0B1.0011101P+8
0b1.0011101p8 0B1.0011101P8
0b10011101000p-2 0B10011101000P-2
請將任何錯誤或功能要求報告給 bug-math-bigrat at rt.cpan.org
,或透過 https://rt.cpan.org/Ticket/Create.html?Queue=Math-BigRat 上的網路介面(需要登入)。我們將會收到通知,然後您會自動收到有關錯誤進度的通知,因為我會進行變更。
您可以使用 perldoc 指令找到此模組的文件。
perldoc Math::BigRat
您也可以在以下位置尋找資訊
GitHub
RT:CPAN 的要求追蹤器
MetaCPAN
CPAN 測試人員矩陣
CPAN 評分
此程式為免費軟體;您可以在與 Perl 相同的條款下重新散布或修改它。
bigrat、Math::BigFloat 和 Math::BigInt,以及後端 Math::BigInt::FastCalc、Math::BigInt::GMP 和 Math::BigInt::Pari。
Tels http://bloodgate.com/ 2001-2009。
由 Peter John Acklam <pjacklam@gmail.com> 於 2011 年後維護