我使用的在Perl统计::描述库来计算频率分布和上来对一个浮点舍入误差的问题。

我通过在两个值,0.205和0.205,(来自其他数量取出并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作为我期望。这意味着,环((分钟+ =范围)

DB <8>打印$自 - > {MAX};结果 0.205结果   DB <9>打印$自 - > {分钟};结果 0.205结果   DB <10>打印$自 - > {MAX} - $自 - > {分钟};结果 2.77555756156289e-17

因此,这看起来像一个舍入问题。我想不出如何,虽然解决这个问题在我的身边,我不知道编辑库是一个好主意。我正在寻找一种解决方法或替代的建议。

干杯, 尼尔

有帮助吗?

解决方案

我的统计::描述维护者。由于其数字特性,已经报道了许多的四舍五入问题。我相信这尤其是一个被利用乘法的部门,而不是+ =固定在以后的版本给你用,我最近发布的一个。

请使用从CPAN的最先进的最新版本和它应该会更好。

其他提示

不完全是一个舍入问题;可以看到更精确的值的东西,如

printf("%.18g %.18g", $self->{max}, $self->{min});

我看来像有其中它假定样本范围可以被划分成$分区片模块中的缺陷;由于浮点不具有无限精度,这是不可能的。在你的情况下,最小值和最大值恰好相邻表示的值,所以不能有一个以上的分区。我不知道究竟该模块使用分区的,所以我不知道这方面的影响可能是什么。 在模块中的另一个可能的问题是,它使用数字作为哈希密钥,这 隐式stringifies它们稍微舍入值。

您可以在喂食前通过stringization洗钱您的数据的一些成功 到模块:

$data = 0+"$data";

此将至少确保两个数字(与默认打印精度)出现等于实际上是相等的。

这不应该导致无限循环。什么会导致该循环是无限的,如果是$self->{sample_range}/$partitions 0将是

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top