Nei*_*lis 2 floating-point statistics perl rounding floating-accuracy
我正在使用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
}
Run Code Online (Sandbox Code Playgroud)
$ self-> sample_range(范围是max-min)返回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
所以这看起来像一个舍入问题.我想不出如何解决这个问题,我不确定编辑库是个好主意.我正在寻找解决方法或替代方案的建议.
干杯,尼尔