4

私は Perl で、時折非常に小さい可能性がある確率で動作するプログラムを持っています。丸め誤差のため、確率の 1 つがゼロになることがあります。以下のチェックを行いたいと思います。

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

4 に答える 4

11

によるとperldoc perlnumber、Perl はネイティブ浮動小数点形式を使用します。ネイティブは、コンパイルに使用された C コンパイラが使用したものとして定義されます。速度よりも精度/精度が気になる場合は、bignumを見てください。

于 2009-08-01T19:29:53.620 に答える
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
于 2009-08-01T21:11:34.833 に答える
8

その最小数は非正規数と呼ばれるものであり、それに対して行われた計算は驚くべき結果をもたらす可能性があることに注意することが重要かもしれません:

$ 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 で始まる仮数もあり、精度の範囲が増加します。

于 2009-08-02T09:20:08.577 に答える
4

実際、perl が浮動小数点数をどのように表すかはわかりません (これは、perl をビルドするときに構成するものだと思います)。しかし、IEEE 754 が使用されていると仮定すると、64 ビット浮動小数点数のイプシロンは 4.94065645841247E-324 になります。 .

于 2009-08-01T19:29:28.723 に答える