J'utilise la bibliothèque Statistics::Descriptive en Perl pour calculer les distributions de fréquence et faire face à un problème d'erreur d'arrondi en virgule flottante. Je passe deux valeurs, 0,205 et 0,205, (tirées d'autres nombres et sprintées vers celles-ci) au module stats et je lui demande de calculer la distribution de fréquence mais il se bloque dans une boucle infinie.Comment puis-je contourner une erreur d'arrondi qui provoque une boucle infinie dans Perl's Statistics :: Descriptive?
Parcourant avec un débogueur je peux voir que ça fait:
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 (La plage est max-min) est de retour 2.77555756156289e-17 plutôt que 0 comme j'attends . Cela signifie que la boucle ((min + = plage) < max)) entre dans une boucle infinie (à toutes fins utiles).
DB < 8> print $ self -> {max};
0.205
DB < 9> print $ self -> {min};
0.205
DB < 10> print $ self -> {max} - $ self -> {min};
2.77555756156289e-17
Cela ressemble à un problème d'arrondi. Je ne sais pas comment résoudre ça de mon côté, et je ne suis pas sûr que l'édition de la bibliothèque soit une bonne idée. Je cherche des suggestions d'une solution de contournement ou d'une alternative.
Cheers, Neil
Salut, Shlomi! Content que tu aies remarqué cette question; vous m'avez sauvé de devoir vous envoyer un lien par courriel. Je vois que la nouvelle version utilise encore des nombres comme des clés de hachage comme $ bins {$ self-> max()} = 0; pour éviter d'avoir ce tour les valeurs, vous pouvez utiliser le pack "F" (nécessite 5.8.0+) et déballer chaque fois que vous utilisez la clé. – ysth
Excellent, merci! J'aurais dû vérifier une nouvelle version, ma faute. Très impressionné par cette réponse à ma première question Stack Overflow. Merci encore à tous ceux qui ont répondu. – NeilInglis