內容

名稱

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),因此請務必查看這兩個模組以取得更多資訊。

new()
$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
numerator()
$n = $x->numerator();

傳回分子(線條上方的部分)的副本,為有符號 BigInt。

denominator()
$d = $x->denominator();

傳回分母(線條下方的部分)的副本,為正 BigInt。

parts()
($n, $d) = $x->parts();

傳回一個清單,包含(有符號)分子和(無符號)分母,為 BigInt。

dparts()

傳回整數部分和小數部分。

fparts()

傳回最小的分子和分母,分子除以分母會得到原始值。對於有限數字,兩個值都是整數。助記符:小數。

numify()
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
as_int()
as_number()
$x = Math::BigRat->new('13/7');
print $x->as_int(), "\n";               # '1'

傳回物件的副本,為 BigInt,截斷為整數。

as_number()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'

傳回物件的副本,為 BigFloat,保留所需的準確度,或預設的 40 個位數。

此方法已新增至 Math::BigRat 的 v0.22(2008 年 4 月)。

as_hex()
$x = Math::BigRat->new('13');
print $x->as_hex(), "\n";               # '0xd'

傳回 BigRat 作為十六進位字串。僅適用於整數。

as_bin()
$x = Math::BigRat->new('13');
print $x->as_bin(), "\n";               # '0x1101'

傳回 BigRat 作為二進位字串。僅適用於整數。

as_oct()
$x = Math::BigRat->new('13');
print $x->as_oct(), "\n";               # '015'

將 BigRat 回傳為八進位字串。僅適用於整數。

from_hex()
my $h = Math::BigRat->from_hex('0x10');

從字串形式的十六進位數字建立 BigRat。

from_oct()
my $o = Math::BigRat->from_oct('020');

從字串形式的八進位數字建立 BigRat。

from_bin()
my $b = Math::BigRat->from_bin('0b10000000');

從字串形式的二進位數字建立 BigRat。

bnan()
$x = Math::BigRat->bnan();

建立新的 BigRat 物件,代表 NaN(非數字)。如果用於物件,它會將其設定為 NaN

$x->bnan();
bzero()
$x = Math::BigRat->bzero();

建立新的 BigRat 物件,代表零。如果用於物件,它會將其設定為零

$x->bzero();
binf()
$x = Math::BigRat->binf($sign);

建立新的 BigRat 物件,代表無限大。選用引數為 '-' 或 '+',表示您要正無限大或負無限大。如果用於物件,它會將其設定為無限大

$x->binf();
$x->binf('-');
bone()
$x = Math::BigRat->bone($sign);

建立新的 BigRat 物件,代表一。選用引數為 '-' 或 '+',表示您要一或負一。如果用於物件,它會將其設定為一

$x->bone();                 # +1
$x->bone('-');              # -1
length()
$len = $x->length();

傳回整數值中 $x 的長度(以位數為單位)。

digit()
print Math::BigRat->new('123/1')->digit(1);     # 1
print Math::BigRat->new('123/1')->digit(-1);    # 3

當 X 為整數值時,傳回 X 中第 N 個位數。

bnorm()
$x->bnorm();

將數字簡化為最短形式。此常式會在需要時自動呼叫。

bfac()
$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

目前僅適用於整數。

bround()/round()/bfround()

尚未實作。

bmod()
$x->bmod($y);

傳回 $x 除以 $y 的餘數。當 $x 為有限值,且 $y 為有限且非零的值時,結果與取整除法(F 除法)後的餘數相同。此外,如果 $x 和 $y 都是整數,結果與 Perl 的 % 算子結果相同。

bmodinv()
$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」。

bmodpow()
$num->bmodpow($exp,$mod);           # modular exponentiation
                                    # ($num**$exp % $mod)

使用二進制指數運算,傳回 $num$exp 次方,模數為 $mod 的值。bmodpow 遠比寫

$num ** $exp % $mod

好得多,因為它快很多 - 它會在可能的情況下將內部變數化簡為模數,因此它作用於較小的數字上。

bmodpow 也支援負指數。

bmodpow($num, -1, $mod)

完全等於

bmodinv($num, $mod)
bneg()
$x->bneg();

用於否定物件本身。

is_one()
print "$x is 1\n" if $x->is_one();

如果 $x 等於一,傳回 true,否則傳回 false。

is_zero()
print "$x is 0\n" if $x->is_zero();

如果 $x 等於零,傳回 true,否則傳回 false。

is_pos()/is_positive()
print "$x is >= 0\n" if $x->is_positive();

如果 $x 為正數(大於或等於零),傳回 true,否則傳回 false。請注意,'+inf' 也是正數,而 'NaN' 和 '-inf' 不是。

is_positive()is_pos() 的別名。

is_neg()/is_negative()
print "$x is < 0\n" if $x->is_negative();

如果 $x 為負數(小於零),傳回 true,否則傳回 false。請注意,'-inf' 也是負數,而 'NaN' 和 '+inf' 不是。

is_negative()is_neg() 的別名。

is_int()
print "$x is an integer\n" if $x->is_int();

如果 $x 的分母為 1(例如沒有小數部分),傳回 true,否則傳回 false。請注意,'-inf'、'inf' 和 'NaN' 不是整數。

is_odd()
print "$x is odd\n" if $x->is_odd();

如果 $x 為奇數,傳回 true,否則傳回 false。

is_even()
print "$x is even\n" if $x->is_even();

如果 $x 為偶數,傳回 true,否則傳回 false。

bceil()
$x->bceil();

將 $x 設定為下一個較大的整數值(例如將數字截斷為整數,然後增加一)。

bfloor()
$x->bfloor();

將 $x 截斷為整數值。

bint()
$x->bint();

將 $x 四捨五入為零。

bsqrt()
$x->bsqrt();

計算 $x 的平方根。

broot()
$x->broot($n);

計算 $x 的 N 次方根。

badd()
$x->badd($y);

將 $y 加到 $x 並傳回結果。

bmul()
$x->bmul($y);

將 $y 乘以 $x 並傳回結果。

bsub()
$x->bsub($y);

將 $y 從 $x 減去並傳回結果。

bdiv()
$q = $x->bdiv($y);
($q, $r) = $x->bdiv($y);

在純量內容中,將 $x 除以 $y 並傳回結果。在清單內容中,執行取整除法(F 除法),傳回整數 $q 和餘數 $r,使得 $x = $q * $y + $r。餘數(模數)等於 $x->bmod($y) 所傳回的值。

binv()
$x->binv();

$x 的反函數。

bdec()
$x->bdec();

將 $x 減 1 並傳回結果。

binc()
$x->binc();

將 $x 加 1 並傳回結果。

copy()
my $z = $x->copy();

建立物件的深度拷貝。

請參閱 Math::BigInt 中的文件以取得更多詳細資訊。

bstr()/bsstr()
my $x = Math::BigRat->new('8/4');
print $x->bstr(), "\n";             # prints 1/2
print $x->bsstr(), "\n";            # prints 1/2

傳回代表此物件的字串。

bcmp()
$x->bcmp($y);

將 $x 與 $y 比較,並考量符號。傳回 -1、0、1 或 undef。

bacmp()
$x->bacmp($y);

將 $x 與 $y 比較,同時忽略其符號。傳回 -1、0、1 或 undef。

beq()
$x -> beq($y);

僅當 $x 等於 $y 時傳回 true,否則傳回 false。

bne()
$x -> bne($y);

僅當 $x 不等於 $y 時傳回 true,否則傳回 false。

blt()
$x -> blt($y);

僅當 $x 等於 $y 時傳回 true,否則傳回 false。

ble()
$x -> ble($y);

僅當 $x 小於或等於 $y 時傳回 true,否則傳回 false。

bgt()
$x -> bgt($y);

僅當 $x 大於 $y 時傳回 true,否則傳回 false。

bge()
$x -> bge($y);

僅當 $x 大於或等於 $y 時傳回 true,否則傳回 false。

blsft()/brsft()

用於將數字向左/右移位。

請參閱 Math::BigInt 中的文件以取得更多詳細資訊。

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);

計算 $x ** $y。

請參閱 Math::BigInt 中的文件以取得更多詳細資訊。

blog()
$x->blog($base, $accuracy);         # logarithm of x to the base $base

如果未定義 $base,則使用歐拉數 (e)

print $x->blog(undef, 100);         # log(x) to 100 digits
bexp()
$x->bexp($accuracy);        # calculate e ** X

計算兩個整數 A 和 B,使得 A/B 等於 e ** $x,其中 e 是歐拉數。

此方法已在 Math::BigRat 的 v0.20 中新增 (2007 年 5 月)。

另請參閱 blog()

bnok()
$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 月)。

config()
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

NUMERIC LITERALS

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

您也可以在以下位置尋找資訊

授權

此程式為免費軟體;您可以在與 Perl 相同的條款下重新散布或修改它。

另請參閱

bigratMath::BigFloatMath::BigInt,以及後端 Math::BigInt::FastCalcMath::BigInt::GMPMath::BigInt::Pari

作者