2009-05-16 6 views
0

J'ai un code, et je ne le comprends pas. Je développe une application dont la précision est très importante. mais ce n'est pas important pour .NET, pourquoi? Je ne sais pas.Double Precision

double value = 3.5; 
MessageBox.Show((value + 1 * Math.Pow(10, -20)).ToString()); 

mais la boîte de message indique: 3.5 S'il vous plaît aidez-moi, je vous remercie.

+0

http://stackoverflow.com/questions/566958/double-precision-problems-on-c-net –

+0

Il n'y a pas 'valeur double' qui est exactement égale à 3,50000000000000000001. Le double le plus proche de ce nombre est 3,5. –

Répondre

1

Vous pouvez avoir une précision, mais cela dépend de ce que vous voulez faire. Si vous mettez ce qui suit dans une application console:

double a = 1e-20; 
Console.WriteLine(" a = {0}", a); 
Console.WriteLine("1+a = {0}", 1+a); 

decimal b = 1e-20M; 
Console.WriteLine(" b = {0}", b); 
Console.WriteLine("1+b = {0}", 1+b); 

Vous obtiendrez

a = 1E-20 
1+a = 1 
b = 0,00000000000000000001 
1+b = 1,00000000000000000001 

Mais Notez que la fonction Pow, comme presque tout dans la classe Math, ne prend en double:

double Pow(double x, double y); 

Donc, vous ne pouvez pas prendre le sinus d'un nombre décimal (autre, puis en le convertissant en double)

Voir aussi this question.

1

Ou utiliser le type Decimal plutôt que double.

+0

Mais vous ne pouvez pas utiliser Math.pow() sur 10 décimales –

+1

^-20 peut facilement être donné comme une constante. Pas besoin d'invoquer Math.Pow() ici. – Joey

+0

ouais vous avez raison, mais je voulais juste montrer mon problème. –

2

La précision d'un Double est de 15 chiffres (17 chiffres en interne). La valeur que vous calculez avec Math.Pow est correcte, mais lorsque vous l'ajoutez à value, elle est trop petite pour faire la différence.

Édition:
Une décimale peut gérer cette précision, mais pas le calcul. Si vous voulez que la précision, vous devez faire le calcul, puis convertir chaque valeur à un Decimal avant de les additionner:

double value = 3.5; 
double small = Math.Pow(10, -20); 

Decimal result = (Decimal)value + (Decimal)small; 

MessageBox.Show(result.ToString()); 
+0

mais que dois-je faire avec ce numéro? –

+0

Une décimale a cette précision, mais vous devez effectuer le calcul en double, puis convertir chaque en décimal avant de les ajouter. Voir ma modification ci-dessus. – Guffa

0

double précision signifie qu'il peut contenir 15-16 chiffres. 3,5 + 1e-20 = 21 chiffres. Il ne peut pas être représenté en double précision. Vous pouvez utiliser un autre type comme décimal.

+0

mais combien de nombres je peux avoir après virgule flottante? –

+0

15-16 chiffres au total. Le point flottant peut être n'importe où avant, après ou entre ces chiffres – Kcats

2

Si vous faites quoi que ce soit où la précision est très importante, vous devez être conscient des limites de la virgule flottante. Une bonne référence est David Goldberg's "What Every Computer Scientist Should Know About Floating-Point Arithmetic".

Vous pouvez constater que virgule flottante ne vous donne pas assez de précision et vous devez travailler avec un type décimal. Ceux-ci, cependant, sont toujours beaucoup plus lent que le virgule flottante - c'est un compromis entre la précision et la vitesse.

+0

Bon article, mais c'est un peu difficile à lire pour les non-mathématiciens. Celui-ci est un peu plus facile à lire pour les singes de code: http://floating-point-gui.de/ –