簡體   English   中英

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM