2010-01-13 15 views
2

J'ai rencontré un comportement étrange en Perl. La soustraction suivante devrait donner zéro résultat (ce qu'il fait en Python):La notation scientifique affecte-t-elle la précision de Perl?

print 7.6178E-01 - 0.76178 
-1.11022302462516e-16 

Pourquoi faut-il se produit et comment l'éviter?

P.S. Effet apparaît sur "v5.10.0 construit pour x86_64-linux-gnu-thread-multi" (Ubuntu 9.04) et "v5.8.9 construit pour darwin-2level" (Mac OS 10.6)

+0

Fonctionne bien pour moi, je reçois 0 (v5.8.8, Mac OSX). –

+1

J'ai deux Perls sur cette machine ici - une version locale de 5.8.8 qui fonctionne correctement, et celle qui est intégrée - qui présente votre problème. –

+0

Se produit également sur 5.10.1, MSWin32-x86-multi-thread (Strawberry Perl 5.10.1.0). –

Répondre

8

Ce n'est pas que la notation scientifique affecte le précision autant que les limitations de la notation à virgule flottante représentée en binaire. Voir les réponses au perlfaq4. C'est un problème pour tout langage qui repose sur l'architecture sous-jacente pour le stockage de nombres.

Si vous avez besoin de mieux numéro de manipulation, consultez le bignum pragma.

+0

Ok, utilisez bignum fait l'affaire. Cependant, je refuse d'accepter ce comportement comme normal, indépendamment de tout problème de représentation binaire. Toute autre langue gère cela correctement. – Simon

+0

Toutes les langues ne stockent pas les numéros de la même manière, et je n'ai rien dit de normal. –

+2

Simon - toute langue qui ne présente pas ce type de problème dans au moins QUELQUES cas de coin n'utilise pas les instructions à virgule flottante du processeur ou ne gère pas correctement les nombres à virgule flottante. Malheureusement, une manipulation incorrecte des nombres est relativement normale (au niveau de la conversion entre les nombres fractionnaires de base 10 et les nombres à virgule flottante). – Vatine