2009-10-07 12 views
9

Desde que necesitaba trabajar con PI (3.1415 ...) en C# He usado Math.PI para obtener el valor. Usualmente solo usaría valores como Math.PI/2.0 o 2.0*Math.PI, pero ahora acabo de notar que XNA proporciona una clase MathHelper. Lo bueno de esto es que puedo llamar al MathHelper.PiOver2 y al MathHelper.TwoPi, lo que hace que un paso extremadamente trivial sea aún más trivial. ;-)C# Matemáticas frente a XNA MathHelper

Supuse que estas dos clases eran intercambiables, pero noté que Math.PI/2.0 != MathHelper.PiOver2. Traté de investigar por qué sería esto, pero no encontré nada. Entonces, pensé que probaría mi suerte aquí. Con respecto al uso de PI, ¿hay alguna diferencia entre la clase de Matemáticas y la clase de MathHelper? ¿Se prefiere uno sobre el otro? ¿O debería dejarlo lo suficientemente bien solo y solo asegurarme de usar consistentemente uno u otro a lo largo de mi programa?

+0

Me sorprendería que MathHelper no llamara a Math.PI entre bastidores. –

Respuesta

11

¿En qué no son iguales? Si están lo suficientemente cerca, este podría ser el problema tradicional de que probar la igualdad con puntos flotantes es casi imposible.

Además, ¿son del mismo tipo? Mi opinión es que la mayoría de los cálculos de juego se realizaron con flotadores, mientras que Math.PI sería un doble.

EDIT: MathHelper does indeed use floats

+0

No es realmente un problema con las pruebas de igualdad, ya que descubrí que estaba viendo la diferencia, que debería resultar en 0.000000000 si fueran iguales. En su lugar: MathHelper.Pi - Math.PI = 8.74227801261895E-08. Esto es lo suficientemente cerca para lo que necesito probar. Solo tenía curiosidad por qué serían diferentes. Pero, estoy de acuerdo, debe ser un problema de flotación vs. doble. – SuperSized

+1

Que está apagado por 10^-8 es probablemente indicativo de la diferencia de flotante-> doble en precisión, específicamente un flotador tiene una precisión de solo 7-8 dígitos. – CoderTao

7

Look a dígitos:

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 a partir de Calc ventanas


Explicación del problema: La pérdida de precisión

Mejor PI/2 = Math.PI/2

+0

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

+0

Gracias por un buen enlace – AndreyAkinshin

3

¡El mejor PI/2 no es Math.PI/2!

En el desarrollo del juego no use la constante Math.PI, la pérdida de precisión es insignificante, no verá la diferencia en el movimiento de los objetos de su juego ... El rendimiento es más importante. El uso de MathHelper.PiOver2 le ahorrará una conversión de doble división y doble para flotar. Esto parece ser de muy poca ayuda, pero existen problemas computacionalmente intensivos (sistemas de partículas) donde la diferencia es significativa.