[英]How to change exponential number format to the floating-point format in Perl
[英]What's the smallest non-zero, positive floating-point number in Perl?
我在Perl中有一個程序可以處理偶爾會非常小的概率。 由於舍入誤差,有時其中一個概率為零。 我想檢查以下內容:
use constant TINY_FLOAT => 1e-200;
my $prob = calculate_prob();
if ( $prob == 0 ) {
$prob = TINY_FLOAT;
}
這工作正常,但我實際上看到Perl生成的數字小於1e-200(我剛看到8.14e-314飛過)。 對於我的應用程序,我可以更改calculate_prob(),以便它返回TINY_FLOAT的最大值和實際概率,但這讓我對如何在Perl中處理浮點數感到好奇。
Perl中最小的正浮點值是多少? 它是平台依賴的嗎? 如果有,是否有一個快速程序,我可以用來在我的機器上找出它?
根據perldoc perlnumber
,Perl使用本機浮點格式,其中native定義為用於編譯它的C編譯器。 如果您更擔心精度/准確度而不是速度,請查看bignum 。
其他答案都很好。 如果您不知道任何該信息並且無法在SO上發布您的問題,以下是如何找出近似ε;-)
#!/usr/bin/perl
use strict;
use warnings;
use constant MAX_COUNT => 2000;
my ($x, $c);
for (my $y = 1; $y; $y /= 2) {
$x = $y;
# guard against too many iterations
last if ++$c > MAX_COUNT;
}
printf "%d : %.20g\n", $c, $x;
輸出:
C:\Temp> thj 1075 : 4.9406564584124654e-324
值得注意的是,最小的數字是所謂的次正規數,並且對其進行的數學運算可能會產生令人驚訝的結果:
$ perl -wle'$x = 4.94e-324; print for $x, $x*1.4, $x*.6'
4.94065645841247e-324
4.94065645841247e-324
4.94065645841247e-324
那是因為它使用了最小的允許(base-2)指數和形式的尾數(base-2)0.0000000 ... 0001。 較大但仍然是次正規的數字也將具有從0開始的尾數和不斷增加的精度范圍。
我實際上不知道perl如何表示浮點數(我認為這是你在構建perl時配置的),但是如果我們假設使用了IEEE 754,那么epsilon對於64位浮點數是4.94065645841247E-324 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.