Perl中最小的非零,正浮点数是多少?

时间:2009-08-01 19:20:46

标签: perl floating-point numerical

我在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中最小的正浮点值是多少?它是平台依赖的吗?如果有,是否有一个快速程序,我可以用来在我的机器上找出它?

4 个答案:

答案 0 :(得分:11)

根据perldoc perlnumber,Perl使用本机浮点格式,其中native定义为用于编译它的C编译器。如果您更担心精度/准确度而不是速度,请查看bignum

答案 1 :(得分:10)

其他答案都很好。如果您不知道任何该信息并且无法在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

答案 2 :(得分:8)

值得注意的是,最小的数字是所谓的次正规数,并且对其进行的数学运算可能会产生令人惊讶的结果:

$ 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开始的尾数和不断增加的精度范围。

答案 3 :(得分:4)

我实际上不知道perl如何表示浮点数(我认为这是你在构建perl时配置的),但如果我们假设使用了IEEE 754,那么epsilon对于64位浮点数是4.94065645841247 E-324。