bigfloat - Perl 的透明大浮點數支援
use bigfloat;
$x = 2 + 4.5; # Math::BigFloat 6.5
print 2 ** 512 * 0.1; # Math::BigFloat 134...09.6
print inf + 42; # Math::BigFloat inf
print NaN * 7; # Math::BigFloat NaN
print hex("0x1234567890123490"); # Perl v5.10.0 or later
{
no bigfloat;
print 2 ** 256; # a normal Perl scalar now
}
# for older Perls, import into current package:
use bigfloat qw/hex oct/;
print hex("0x1234567890123490");
print oct("01234567890123490");
在給定範圍內的所有數字文字都會轉換成 Math::BigFloat 物件。
除了範圍運算子 ..
之外,所有運算子(包括基本的數學運算)都已重載。
因此,下列程式碼
use bigfloat;
$x = 1234;
會建立一個 Math::BigFloat,並將其參考儲存在 $x 中。這會在背景中透明地執行。
你可以使用下列程式碼查看
perl -Mbigfloat -le 'print ref(1234)'
由於數字實際上是物件,因此你可以對其呼叫 Math::BigFloat 中的所有一般方法。這甚至可以在某些程度上對運算式執行
perl -Mbigfloat -le '$x = 1234; print $x->bdec()'
perl -Mbigfloat -le 'print 1234->copy()->binc();'
perl -Mbigfloat -le 'print 1234->copy()->binc->badd(6);'
perl -Mbigfloat -le 'print +(1234)->copy()->binc()'
(請注意,如果運算式以 '(' 開頭,print 無法執行預期的動作,因此需要加上 +
)
你甚至可以像平常一樣將運算串連在一起
perl -Mbigfloat -le 'print 1234->copy()->binc->badd(6);'
1241
請注意,下列程式碼無法執行預期的動作(不會印出任何內容),因為 Perl 中尚無法重載 '..'(截至 v5.8.0)
perl -Mbigfloat -le 'for (1..2) { print ref($_); }'
bigfloat
識別一些選項,可以在透過 use
載入時傳遞。以下是現有的選項
這會設定所有數學運算的精確度。參數必須大於或等於零。請參閱 Math::BigInt 的 bround() 方法以取得詳細資料。
perl -Mbigfloat=a,50 -le 'print sqrt(20)'
請注意,無法同時設定精確度和準確度。
這會設定所有數學運算的準確度。參數可以是任何整數。負值表示小數點後固定位數,而正值表示從小數點左邊捨入到此位數。0 表示捨入為整數。請參閱 Math::BigInt 的 bfround() 方法以取得詳細資料。
perl -Mbigfloat=p,-50 -le 'print sqrt(20)'
請注意,無法同時設定精確度和準確度。
這會啟用追蹤模式,主要用於偵錯。
載入不同的數學函式庫,請參閱 "數學函式庫"。
perl -Mbigfloat=l,GMP -e 'print 2 ** 512'
perl -Mbigfloat=lib,GMP -e 'print 2 ** 512'
perl -Mbigfloat=try,GMP -e 'print 2 ** 512'
perl -Mbigfloat=only,GMP -e 'print 2 ** 512'
使用可以處理大數的版本覆寫內建的 hex() 方法。這會透過將其匯出到目前套件來覆寫它。在 Perl v5.10.0 和更新版本中,這不是那麼必要,因為每當 bigfloat
實用程式處於活動狀態時,hex() 會在目前範圍中以詞彙方式覆寫。
使用可以處理大數的版本覆寫內建的 oct() 方法。這會透過將其匯出到目前套件來覆寫它。在 Perl v5.10.0 和更新版本中,這不是那麼必要,因為每當 bigfloat
實用程式處於活動狀態時,oct() 會在目前範圍中以詞彙方式覆寫。
這會列印模組的名稱和版本,然後結束。
perl -Mbigfloat=v
使用數字進行數學運算(預設)是由後端函式庫模組 Math::BigInt::Calc 執行。預設值等於表示
use bigfloat lib => 'Calc';
您可以使用來變更這項設定
use bigfloat lib => 'GMP';
下列範例會先嘗試尋找 Math::BigInt::Foo,然後是 Math::BigInt::Bar,如果這也失敗,則會回復到 Math::BigInt::Calc
use bigfloat lib => 'Foo,Math::BigInt::Bar';
如果找不到任何指定的函式庫,c<lib> 會發出警告,而 Math::BigInt 會退回至其中一個預設函式庫。若要抑制此警告,請改用 c<try>
use bigfloat try => 'GMP';
如果您希望程式碼執行 die 而非退回,請改用 only
use bigfloat only => 'GMP';
請參閱相關模組文件以取得更多詳細資料。
由於所有數字現在都是物件,因此您可以使用 Math::BigFloat API 中的所有方法。
但請注意。當使用下列方式複製數字時,只會進行淺層複製。
$x = 9; $y = $x;
$x = $y = 7;
使用複本或原始值進行超載運算沒問題,例如,下列運算會成功
$x = 9; $y = $x;
print $x + 1, " ", $y,"\n"; # prints 10 9
但呼叫任何直接修改數字的方法,將導致原始值和複本都被銷毀
$x = 9; $y = $x;
print $x->badd(1), " ", $y,"\n"; # prints 10 10
$x = 9; $y = $x;
print $x->binc(1), " ", $y,"\n"; # prints 10 10
$x = 9; $y = $x;
print $x->bmul(2), " ", $y,"\n"; # prints 18 18
使用不會修改,但會測試內容的方法
$x = 9; $y = $x;
$z = 9 if $x->is_zero(); # works fine
請參閱複本建構函式和超載中的=
的說明文件,以及 Math::BigFloat 中的說明文件以取得更多詳細資料。
返回 Math::BigFloat->binf() 的捷徑。很有用,因為 Perl 不總是正確處理裸字 inf
。
返回 Math::BigFloat->bnan() 的捷徑。很有用,因為 Perl 不總是正確處理裸字 NaN
。
# perl -Mbigfloat=e -wle 'print e'
傳回歐拉數 e
,又稱 exp(1)
# perl -Mbigfloat=PI -wle 'print PI'
傳回 PI。
bexp($power, $accuracy);
傳回歐拉數 e
提升到適當次方,達到想要的精度。
範例
# perl -Mbigfloat=bexp -wle 'print bexp(1,80)'
bpi($accuracy);
傳回 PI,達到想要的精度。
範例
# perl -Mbigfloat=bpi -wle 'print bpi(80)'
設定或取得精度。
設定或取得精度。
設定或取得捨入模式。
設定或取得除法比例。
設定或取得降級類別升級到的類別(如果有的話)。將升級類別設定為 undef
以停用升級。
預設停用升級。
設定或取得升級類別降級到的類別(如果有的話)。將降級類別設定為 undef
以停用升級。
預設停用降級。
use bigfloat;
print "in effect\n" if bigfloat::in_effect; # true
{
no bigfloat;
print "in effect\n" if bigfloat::in_effect; # false
}
如果 bigfloat
在目前範圍內有效,傳回 true 或 false。
此方法僅適用於 Perl v5.9.4 或更新版本。
Perl(和此模組)接受十六進位、八進位和二進位浮點文字,但請小心在 v5.32.0 之前的 Perl 版本中使用它們,因為某些版本的 Perl 會在不提示的情況下提供錯誤的結果。
bigrat
透過重載整數和浮點文字的處理方式來運作,將它們轉換為 Math::BigRat 物件。
這表示僅包含字串值或字串文字的算術運算會使用 Perl 的內建運算子執行。
例如
use bigrat;
my $x = "900000000000000009";
my $y = "900000000000000007";
print $x - $y;
在預設的 32 位元組建置中輸出 0
,因為 bigfloat
從未看到字串文字。若要確保表達式全部視為 Math::BigFloat
物件,請在表達式中使用文字數字
print +(0+$x) - $y;
Perl 不允許重載範圍,因此您既不能安全地將範圍與 bigfloat
端點一起使用,也不是迭代器變數為 Math::BigFloat
。
use 5.010;
for my $i (12..13) {
for my $j (20..21) {
say $i ** $j; # produces a floating-point number,
# not an object
}
}
此方法僅適用於 Perl v5.9.4 或更新版本。
bigfloat
以可處理大整數值的其他版本覆寫這些常式。然而,在 Perl v5.9.4 之前的版本中,除非您特別使用兩個匯入標籤「hex」和「oct」要求它,否則不會發生這種情況 - 然後它將會是全域性的,且無法在範圍內使用 no bigfloat
停用
use bigfloat qw/hex oct/;
print hex("0x1234567890123456");
{
no bigfloat;
print hex("0x1234567890123456");
}
第二次呼叫 hex() 會警告非可攜式常數。
將其與下列內容比較
use bigfloat;
# will warn only under Perl older than v5.9.4
print hex("0x1234567890123456");
一些很酷的命令列範例,用來讓 Python 群眾印象深刻 ;)
perl -Mbigfloat -le 'print sqrt(33)'
perl -Mbigfloat -le 'print 2**255'
perl -Mbigfloat -le 'print 4.5+2**255'
perl -Mbigfloat -le 'print 3/7 + 5/7 + 8/3'
perl -Mbigfloat -le 'print 123->is_odd()'
perl -Mbigfloat -le 'print log(2)'
perl -Mbigfloat -le 'print exp(1)'
perl -Mbigfloat -le 'print 2 ** 0.5'
perl -Mbigfloat=a,65 -le 'print 2 ** 0.2'
perl -Mbigfloat=l,GMP -le 'print 7 ** 7777'
請將任何錯誤或功能要求回報至 bug-bignum at rt.cpan.org
,或透過 https://rt.cpan.org/Ticket/Create.html?Queue=bignum 網路介面(需要登入)。我們將收到通知,然後當我進行變更時,您將自動收到錯誤進度的通知。
您可以使用 perldoc 指令找到此模組的說明文件。
perldoc bigfloat
您也可以在以下位置尋找資訊
GitHub
RT:CPAN 的要求追蹤器
MetaCPAN
CPAN 測試人員矩陣
CPAN 評分
此程式為自由軟體;您可以在與 Perl 相同的條款下重新散布或修改它。
Math::BigInt、Math::BigFloat、Math::BigRat 和 Math::Big,以及 Math::BigInt::FastCalc、Math::BigInt::Pari 和 Math::BigInt::GMP。
2002 年初至 2007 年間,(C) by Tels http://bloodgate.com/。
由 Peter John Acklam <pjacklam@gmail.com> 於 2014 年以後維護。