perl - 我如何解决导致 Perl 的 Statistics::Descriptive 无限循环的舍入错误?

标签 perl statistics floating-point rounding floating-accuracy

我正在使用 Statistics::Descriptive 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

}

$self->sample_range(范围是最大-最小)返回 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

所以这看起来像是一个舍入问题。不过,我想不出如何解决这个问题,而且我不确定编辑库是个好主意。我正在寻找解决方法或替代方案的建议。

干杯, 尼尔

最佳答案

我是 Statistics::Descriptive 维护者。由于其数字性质,已报告了许多舍入问题。我相信这个特殊的版本在我最近发布的你正在使用的版本中已修复,通过使用乘法代替 +=。

请使用the most up-to-date version来自 CPAN,应该会更好。

关于perl - 我如何解决导致 Perl 的 Statistics::Descriptive 无限循环的舍入错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/944553/

相关文章:

r - 功效与效应大小图

machine-learning - 如何证明EM的收敛性?

c - 浮点值 - 基础知识

java - 在 Java 中将价格四舍五入到最接近的 5cent 倍数

perl - 反转从 CGI 脚本中的文件读取的行数组

regex - "modern"正则表达式的识别能力

linux - perl fork() exec() ,子进程疯狂

database - 数据集——我在哪里可以找到关于不同汽车实例的原始价格/零售值(value)的数据集?

javascript - -= 0.1 奇怪的结果

perl - 为什么即使我正在使用 Archive::Tar:Streamed,%MEM 也会逐渐增加?