2009-10-07 15 views
9

Depuis que j'ai besoin de travailler avec PI (3.1415 ...) en C# j'ai utilisé Math.PI pour obtenir la valeur. Habituellement, je voudrais juste utiliser des valeurs comme Math.PI/2.0 ou 2.0*Math.PI, mais maintenant je viens de remarquer que XNA fournit une classe MathHelper. La bonne chose à ce sujet est que je peux appeler MathHelper.PiOver2 et MathHelper.TwoPi, rendant ainsi une étape extrêmement triviale encore plus triviale. ;-)C# Math vs. XNA MathHelper

Je supposais que ces deux classes étaient interchangeables, mais j'ai remarqué que Math.PI/2.0 != MathHelper.PiOver2. J'ai essayé de chercher pourquoi ce serait, mais je n'ai rien trouvé. Donc, j'ai pensé que je tenterais ma chance ici. En ce qui concerne l'utilisation de PI, existe-t-il des différences entre la classe Math et la classe MathHelper? Est-ce que l'un est préféré à l'autre? Ou devrais-je simplement laisser assez tranquille et m'assurer de toujours utiliser l'un ou l'autre tout au long de mon programme?

+0

Je serais surpris si MathHelper n'appelait pas Math.PI dans les coulisses. –

Répondre

11

À quel point ne sont-ils pas égaux? Si elles sont suffisamment proches, cela peut être le problème traditionnel que tester l'égalité avec des points flottants est presque impossible.

De même, sont-ils du même type? Mon opinion était la plupart des calculs de jeu ont été faits avec des flotteurs, où Math.PI serait un double.

EDIT: MathHelper does indeed use floats

+0

Ce n'est pas vraiment un problème de tester l'égalité puisque j'ai découvert cela en regardant la différence, ce qui devrait aboutir à 0.000000000 s'ils étaient identiques. A la place: MathHelper.Pi - Math.PI = 8.74227801261895E-08. Ceci est certainement assez proche de ce que j'ai besoin de tester. J'étais juste curieux de savoir pourquoi ils seraient différents. Mais, je suis d'accord, il doit s'agir d'un flotteur ou d'un double problème. – SuperSized

+1

Le fait qu'il soit éteint par 10^-8 est probablement indicatif de la double différence de précision float->, en particulier un flottant n'est précis qu'à environ 7-8 chiffres. – CoderTao

7

Rechercher à chiffres:

3,1415926535897900000000000000000 // Math.PI.

3,1415930000000000000000000000000 // MathHelper.PI

3,1415926535897932384626433832795 // PI de Windows Calc


1,5707963267949000000000000000000 // Math.PI./2

1,5707963705062900000000000000000 // MathHelper.PiOver2

1,5707960000000000000000000000000 // MathHelper.Pi/2

1,5707963267948966192313216916398 // PI/2 de windows Calc


Explication du problème: La perte de précision

Meilleur PI/2 = Math.PI/2

+0

Pi à 10000 dp: http://joyofpi.com/pi.html –

+0

Merci pour le bon lien – AndreyAkinshin

3

Le meilleur PI/2 n'est pas Math.PI/2!

Dans le développement du jeu n'utilisez pas la constante Math.PI, la perte de précision est négligeable, vous ne verrez pas la différence dans le mouvement de vos objets de jeu ... La performance est plus importante. L'utilisation de MathHelper.PiOver2 vous permettra d'économiser une double division et une conversion double à flottante. Cela peut sembler être très peu utile, mais il existe des problèmes de calcul intensif (systèmes de particules) où la différence est significative.