2010-05-11 5 views

Répondre

10

C'est donner la "mauvaise" réponse simplement parce que toutes les valeurs réelles ne sont pas représentables par des flotteurs (ou doubles, d'ailleurs). Ce que vous obtiendrez est une approximation basée sur le codage sous-jacent.

Afin de représenter chaque valeur réelle, même entre 1,0x10 -100 et 1.1x10 -100 (une gamme vraiment minuscule), vous avez encore besoin d'un nombre infini de bits.

Les valeurs IEEE754 à simple précision ont seulement 32 bits disponibles (dont certains sont affectés à d'autres choses telles que les représentations d'exposant et NaN/Inf) et ne peuvent donc pas vous donner une précision infinie. Ils ont en fait 23 bits disponibles donnant une précision d'environ 2 (il y a un bit implicite supplémentaire) ou un peu plus de 7 chiffres décimaux (log (2) est d'environ 7,2).

Je joins le mot "faux" entre guillemets parce que ce n'est pas réellement faux. Ce qui ne va pas, c'est votre compréhension de la façon dont les ordinateurs représentent les chiffres (ne soyez pas offensé cependant, vous n'êtes pas seul dans cette méprise).

Rendez-vous sur http://www.h-schmidt.net/FloatApplet/IEEE754.html et tapez votre numéro dans la case "Représentation décimale" pour voir cela en action. Si vous voulez un nombre plus précis, utilisez des doubles plutôt que des flottants - ils ont le double du nombre de bits disponibles pour représenter les valeurs (en supposant que votre implémentation C utilise les types de données simple et double précision IEEE754 pour float et double respectivement). Si vous voulez une précision arbitraire, vous devez utiliser une bibliothèque "bignum" comme GMP bien que ce soit un peu plus lent que les types natifs, alors assurez-vous de bien comprendre les compromis.

2

Le nombre décimal 12345.054321 ne peut pas être représenté avec précision comme float sur votre plate-forme. Le résultat que vous voyez est une approximation décimale du nombre le plus proche pouvant être représenté comme float.

+0

Je savais que ce arrivé en cas de C#. Mais jamais connu dans le cas de C. – anonymous

+0

'float' de C est également fixe type de précision donc il n'y a pas de différence à C#. –

0

Les valeurs à virgule flottante à simple précision ne peuvent représenter que de huit à neuf chiffres significatifs (décimaux). Au-delà de ce point, vous voyez une erreur de quantification.

0

Tout est à faire avec précision. Votre numéro ne peut pas être stocké avec précision dans un flotteur.

+0

Vrai et faux - le nombre d'OP ne peut pas être stocké avec précision, mais les flottants peuvent stocker des nombres de haute précision exactement, ils doivent juste être exactement représentables en binaire (par exemple 1/65536). –

+2

@Matt, ce n'était pas vraiment une réclamation faite par zaf, qui a déclaré: _Votre numéro_ ne peut pas ... – paxdiablo

+0

Droit, upvoted. Je disais simplement que la précision en soi n'est pas un problème avec les flotteurs. –

Questions connexes