Pourquoi Visual Studio 2008 me dire ,9-,8999999999999995 = 0.00000000000000055511151231257827?

StackOverflow https://stackoverflow.com/questions/1662600

Question

Quand je tape ceci dans le Visual Studio 2008 fenêtre immédiate:

? .9 - .8999999999999995

Il me donne ce que la réponse:

0.00000000000000055511151231257827

La documentation dit qu'un double a 15-16 chiffres de précision, mais il me donne un résultat avec 32 chiffres de précision. Où est tout ce que la précision supplémentaire vient?

Autres conseils

Vous devriez lire: Ce que tout informaticien doit- Savoir sur Virgule flottante Arithmétique .

Fondamentalement, il se résume à un nombre flottant point enregistré avec une précision finie. Vous devez faire votre comparaison avec un certain delta.

if(.9 - .8999999999999995 <= 0.0001)
  //close enough to be equal

Les zéros ne sont pas significatifs / partie de la précision (jusqu'à la nombre à virgule flottante est concerné - mathématiquement parlant, ils sont significative). Les zéros sont dus à la partie exposant de la représentation interne du nombre à virgule flottante.

La partie 55511151231257827 (qui est le mantisse ou mantisse ) comporte 17 chiffres décimaux, ce qui est assez proche de 15-16 chiffres.

@Lars D: Qu'est-ce que vous considérez être correct, n'est correcte dans le contexte de la question. .9 - .8999999999999995 fonctionne à un flotteur avec significand 0,625 et exposant de -50. Prendre 0,625 * 2 -50 Résultats dans 5.5511151231257827e-16. Maintenant, hors du contexte de la question initiale, nous avons un certain nombre avec 17 chiffres significatifs qui ne arriver à être notre meilleure approximation binaire de ,0000000000000005. Cependant, ces zéros ne sont pas encore significatifs dans la mesure où la représentation du nombre à virgule flottante est concerné.

  

? ,9-,8999999999999995

Ce processus de soustraction, avec 15-16 chiffres significatifs, donne

  

,0000000000000005

Le reste des chiffres sont simplement des erreurs d'arrondi. Cependant, étant donné que l'ordinateur stocke toujours 15-16 chiffres significatifs après le premier chiffre non nul, les erreurs d'arrondi sont présentés, et vous obtenez beaucoup de chiffres aléatoires de fuite produites par des erreurs d'arrondi. Ainsi, le résultat a 16 chiffres significatifs de l'opération de soustraction plus 16 chiffres à partir du stockage du résultat, ce qui donne 32 chiffres.

Le « flottant » une partie de « virgule flottante » signifie que vous obtenez quelque chose de plus proche de 5,5511151231257827 * 10 ^ (- 16). Ce n'est pas exactement comment il est représenté, car bien sûr, tout cela se fait en binaire sous le capot, mais le point est, le nombre est représenté par les chiffres significatifs, plus un nombre qui représente la distance pour déplacer le radix (point décimal). Comme toujours, wikipedia peut vous donner plus de détails:

(Le deuxième lien est plus particulièrement axé sur votre cas particulier.)

Je pense que parce que dans le système binaire, 5 est périodique comme il n'est pas divisibles par 2. Et puis ce que Mark a dit Rushakoff applique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top