我正在使用 Perl 中的Statistics::Descriptive库来计算频率分布并遇到浮点舍入误差问题。
我将两个值 0.205 和 0.205(取自其他数字并 sprintf'd 到那些)传递给 stats 模块并要求它计算频率分布,但它陷入了无限循环。
使用调试器单步执行,我可以看到它正在执行以下操作:
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
}
$self->sample_range (范围是 max-min)返回 2.77555756156289e-17 而不是我期望的 0。这意味着循环 ((min+=range) < max)) 进入(出于所有意图和目的)无限循环。
DB<8> 打印 $self->{max};
0.205
DB<9> 打印 $self->{min};
0.205
DB<10> 打印 $self->{max}-$self->{min};
2.77555756156289e-17
所以这看起来像一个舍入问题。不过,我想不出如何解决这个问题,而且我不确定编辑库是个好主意。我正在寻找解决方法或替代方法的建议。
干杯,尼尔