私は頻度分布を計算し、浮動小数点の丸め誤差の問題に対処するためにPerlでStatistics::Descriptiveライブラリを使用しています。PerlのStatistics :: Descriptiveで無限ループを引き起こす丸め誤差を回避するにはどうしたらいいですか?
私は統計モジュールに0.205と0.205の2つの値(他の数値とsprintf'dから取得)を渡し、頻度分布を計算するよう依頼しますが、無限ループに陥っています。私はそれがやっていることがわかりますデバッガでステップスルー
:私は期待通り(範囲は最大 - 最小である)
my $interval = $self->{sample_range}/$partitions;
my $iter = $self->{min};
while (($iter += $interval) < $self->{max}) {
$bins{$iter} = 0;
push @k, $iter; ##Keep the "keys" unstringified
}
$自己> sample_rangeは2.77555756156289e-17ではなく0を返します。これは、ループ((min + = range)< max)が(すべての目的と目的のために)無限ループに入ることを意味します。
DB < 8> print $ self - > {max};
0.205
DB < 9> print $ self - > {min};
0.205
DB < 10> print $ self - > {max} - $ self - > {min};
2.77555756156289e-17
これは丸めの問題のようです。私はこれを私の側で修正する方法を考えることはできません、そして、私はライブラリの編集が良いアイデアであるとは確信していません。私は回避策または代替の提案を探しています。
乾杯、 ニール
こんにちは、Shlomi!あなたはこの質問に気づきました。私にあなたにそれへのリンクを電子メールで送ることから私を救った。私は新しいバージョンがまだ$ bins {$ self-> max()} = 0のようなハッシュキーとして数字を使っているのを見ています。この丸めを回避するには、pack "F"(5.8.0+が必要)を使用し、キーを使用するときはいつでも解凍してください。 – ysth
優秀、ありがとう!私は新しいバージョン、私の欠陥を確認しておくべきだった。私の最初のスタックオーバーフローの質問に対するこの応答に非常に感銘を受けました。返答したすべての人に再び感謝します。 – NeilInglis