代码之家  ›  专栏  ›  技术社区  ›  James Thompson

Perl中最小的非零正浮点数是什么?

  •  3
  • James Thompson  · 技术社区  · 16 年前

    我有一个用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(),使它返回微小的_float的最大值和实际的概率,但这让我好奇在Perl中如何处理浮点数字。

    Perl中最小的正浮点值是什么?是否依赖于平台?如果是这样,有没有一个快速程序可以用来在我的机器上解决这个问题?

    4 回复  |  直到 16 年前
        1
  •  9
  •   Sinan Ünür    16 年前

    其他答案都很好。以下是如果您不知道这些信息,并且无法将您的问题发布到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
  •  11
  •   Chas. Owens    16 年前

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

        3
  •  8
  •   ysth    16 年前

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

    $ perl -wle'$x = 4.94e-324; print for $x, $x*1.4, $x*.6'
    4.94065645841247e-324
    4.94065645841247e-324
    4.94065645841247e-324
    

    这是因为它使用了最小的允许(基-2)指数和尾数形式(基-2)0.0000000…0001。更大,但仍低于正常值,数字也将有尾数开始0。以及越来越大的精度范围。

        4
  •  4
  •   Martin Liversage    16 年前

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