Я использую библиотеку 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 (диапазон max-min) возвращает 2.77555756156289e-17, а не 0, как я ожидал. Это означает, что цикл ((min + = range)
DB <8> print $ self -> {max};
0,205
DB <9> print $ self -> {min};
0,205
DB <10> print $ self -> {max} - $ self -> {min};
2.77555756156289e-17
Так что это похоже на проблему округления. Я не могу думать, как исправить это на моей стороне, хотя, и я не уверен, что редактирование библиотеки - хорошая идея. Я ищу предложения об обходном пути или альтернативе.
Cheers,
Neil