Я использую библиотеку Statistics::Descriptive в Perl для вычисления частотных распределений и решения проблемы с ошибкой округления с плавающей запятой.Как я могу обойти ошибку округления, которая вызывает бесконечный цикл в статистике Perl :: Descriptive?
Я передаю два значения, 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> print $ self -> {max};
0,205
DB < 9> print $ self -> {min};
0,205
DB < 10> print $ self -> {max} - $ self -> {min};
2.77555756156289e-17
Так что это похоже на проблему округления. Я не могу думать, как это исправить на моей стороне, но я не уверен, что редактирование библиотеки - хорошая идея. Я ищу предложения об обходном пути или альтернативе.
Приветствия, Нил
Hi, Shlomi! Рад, что вы заметили этот вопрос; вы избавили меня от необходимости отправлять вам по электронной почте ссылку. Я вижу, что новая версия все еще использует числа как хеш-ключи, такие как $ bins {$ self-> max()} = 0; чтобы избежать округления значений, вы можете использовать пакет «F» (требуется 5.8.0+) и распаковывать всякий раз, когда вы используете ключ. – ysth
Отлично, спасибо! Я должен был проверить новую версию, по моей вине. Очень впечатлен этим ответом на мой первый вопрос о переполнении стека. Еще раз спасибо всем, кто ответил. – NeilInglis