Я использую библиотеку Statistics :: Descriptive в Perl для расчета частотного распределения и против проблемы с ошибкой округления с плавающей запятой.
Я передаю два значения, 0.205 и 0.205 (взятые из других чисел и спринт к ним) в модуль статистики и прошу его вычислить частотное распределение, но он застревает в бесконечном цикле.
Пройдя через отладчик, я вижу, что он делает:
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) ‹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
Это похоже на проблему округления. Я не могу придумать, как это исправить со своей стороны, и я не уверен, что редактирование библиотеки - хорошая идея. Я ищу предложения по обходному пути или альтернативе.
Привет, Нил