2009-10-07 11 views
9

Odkąd potrzebowałem pracować z PI (3.1415 ...) w C# użyłem Math.PI aby uzyskać wartość. Zwykle po prostu używałbym wartości takich jak Math.PI/2.0 lub 2.0*Math.PI, ale właśnie zauważyłem, że XNA zapewnia klasę MathHelper. Zaletą jest to, że mogę nazwać MathHelper.PiOver2 i MathHelper.TwoPi, dzięki czemu niezwykle banalny krok jest jeszcze bardziej banalny. ;-)C# Math vs. XNA MathHelper

Zakładam, że te dwie klasy były wymienne, ale zauważyłem, że Math.PI/2.0 != MathHelper.PiOver2. Próbowałem zbadać, dlaczego tak jest, ale niczego nie znalazłem. Pomyślałem, że spróbuję tu szczęścia. Jeśli chodzi o używanie PI, czy są jakieś różnice między klasą Math a klasą MathHelper? Czy preferujesz jeden nad drugim? Czy powinienem po prostu zostawić się wystarczająco dobrze i po prostu upewnić się, że konsekwentnie używasz jednego lub drugiego w całym moim programie?

+0

Byłbym zaskoczony, gdyby MathHelper nie nazwał Math.I za kulisami. –

Odpowiedz

11

Jak nie są równe? Jeśli są wystarczająco bliskie, może to być tradycyjny problem polegający na tym, że testowanie równości z punktami zmiennymi jest prawie niemożliwe.

Czy są one tego samego typu? Moim zdaniem większość obliczeń w grach wykonywana była przy pomocy pływaków, gdzie jako Math.PI byłaby podwójna.

EDIT: MathHelper does indeed use floats

+0

To naprawdę nie jest problem z testowaniem dla równości, ponieważ odkryłem to patrząc na różnicę, która powinna spowodować 0.000000000, gdyby były takie same. Zamiast: MathHelper.Pi - Math.PI = 8.74227801261895E-08. Jest to z pewnością wystarczająco blisko tego, co muszę przetestować. Byłem po prostu ciekaw, dlaczego oni będą inni. Ale, zgadzam się, musi to być płynny a podwójny problem. – SuperSized

+1

To, że jest wyłączone przez 10^-8, prawdopodobnie wskazuje na podwójną różnicę precyzji, konkretnie wartość zmiennoprzecinkowa wynosi tylko około 7-8 cyfr. – CoderTao

7

Spójrz na cyfrze:

3,1415926535897900000000000000000 // Math.PI

3,1415930000000000000000000000000 // MathHelper.PI

3,1415926535897932384626433832795 // PI z Windows Calc


1,5707963267949000000000000000000 // Math.PI/2

1,5707963705062900000000000000000 // MathHelper.PiOver2

1,5707960000000000000000000000000 // MathHelper.Pi/2

1,5707963267948966192313216916398 // PI/2 od okna Calc


Wyjaśnienie problemu: utrata dokładności

Najlepszy PI/2 = Math.PI/2

+0

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

+0

Dziękuję za dobry link – AndreyAkinshin

3

Najlepszy PI/2 nie jest Math.PI/2!

Przy tworzeniu gier nie używaj stałej Math.PI, utrata dokładności jest znikoma, nie zobaczysz różnicy w ruchu obiektów w grze ... Wydajność jest ważniejsza. Korzystanie z MathHelper.PiOver2 pozwoli Ci zaoszczędzić podwójną dywizję i podwójną konwersję. Może to wydawać się bardzo małą pomocą, ale istnieją problemy o intensywności obliczeniowej (systemy cząsteczek), w których różnica jest znacząca.