2009-10-07 9 views
9

Seit ich mit PI (3.1415 ...) in C# arbeiten musste, habe ich Math.PI verwendet, um den Wert zu erhalten. Normalerweise würde ich nur Werte wie Math.PI/2.0 oder 2.0*Math.PI verwenden, aber jetzt habe ich gerade bemerkt, dass XNA eine MathHelper-Klasse bietet. Das Schöne daran ist, dass ich MathHelper.PiOver2 und MathHelper.TwoPi anrufen kann, was einen extrem trivialen Schritt noch trivialer macht. ;-)C# Mathe vs XNA MathHelper

Ich nahm an, dass diese zwei Klassen austauschbar waren, aber ich bemerkte, dass Math.PI/2.0 != MathHelper.PiOver2. Ich habe versucht zu erforschen, warum das so sein würde, aber ich habe nichts gefunden. Also dachte ich, ich würde mein Glück hier versuchen. Gibt es hinsichtlich der Verwendung von PI Unterschiede zwischen der Math-Klasse und der MathHelper-Klasse? Wird einer dem anderen vorgezogen? Oder sollte ich einfach gut genug in Ruhe lassen und sicherstellen, dass ich das eine oder andere konsequent in meinem Programm verwende?

+0

Ich wäre überrascht, wenn MathHelper Math.PI hinter den Kulissen nicht aufrufen würde. –

Antwort

11

Wie nicht gleich sind sie? Wenn sie ausreichend nahe sind, könnte dies das traditionelle Problem sein, dass das Testen der Gleichheit mit Fließkommawerten nahezu unmöglich ist.

Sind sie auch vom gleichen Typ? Meine Meinung war, dass die meisten Gaming-Berechnungen mit Floats gemacht wurden, wo Math.PI ein Double wäre.

EDIT: MathHelper does indeed use floats

+0

Es ist nicht wirklich ein Problem mit dem Testen auf Gleichheit, da ich dies herausgefunden habe, indem ich auf den Unterschied schaue, der zu 0,000000000 führen sollte, wenn sie gleich wären. Stattdessen: MathHelper.Pi - Math.PI = 8.74227801261895E-08. Dies ist sicherlich nahe genug für das, was ich testen muss. Ich war nur neugierig, warum sie anders sein würden. Aber ich stimme zu, es muss ein Float-vs.-Double-Problem sein. – SuperSized

+1

Dass es bei 10^-8 aus ist, deutet wahrscheinlich auf den float-> doppelten Unterschied in der Genauigkeit hin, speziell ein float ist nur auf ungefähr 7-8 Ziffern genau. – CoderTao

7

Blick auf Ziffer:

3,1415926535897900000000000000000 // Math.PI

3,1415930000000000000000000000000 // MathHelper.PI

3,1415926535897932384626433832795 // PI aus Windows Calc


1,5707963267949000000000000000000 // Math.PI/2

1,5707963705062900000000000000000 // MathHelper.PiOver2

1,5707960000000000000000000000000 // MathHelper.Pi/2

1,5707963267948966192313216916398 // PI/2 von Windows-Calc


Erläuterung des Problems: der Verlust an Genauigkeit

Beste PI/2 = Math.PI/2

+0

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

+0

Vielen Dank für einen guten Link – AndreyAkinshin

3

Beste PI/2 ist nicht Math.PI/2!

In Spielentwicklung verwenden Sie nicht die Math.PI Konstante, der Verlust der Genauigkeit ist vernachlässigbar, Sie sehen nicht den Unterschied in der Bewegung Ihrer Spielobjekte ... Die Leistung ist wichtiger. Wenn Sie MathHelper.PiOver2 verwenden, können Sie eine Doppel-Divisionen- und eine Double-to-Float-Konvertierung speichern. Dies scheint sehr wenig hilfreich zu sein, aber es gibt rechenintensive Probleme (Partikelsysteme), bei denen der Unterschied signifikant ist.