2009-10-07 53 views
9

因为我需要在C#中使用PI(3.1415 ...),所以我使用Math.PI来获取值。通常我只会使用像Math.PI/2.02.0*Math.PI这样的值,但现在我刚刚注意到XNA提供了一个MathHelper类。关于这件事的好处是,我可以拨打MathHelper.PiOver2MathHelper.TwoPi,这样做会变得非常微不足道。 ;-)C#数学与XNA MathHelper

我假设这两个类是可以互换的,但我注意到Math.PI/2.0 != MathHelper.PiOver2。我试图研究为什么会这样,但我什么都没发现。所以,我想我会在这里尝试我的运气。关于使用PI,Math类和MathHelper类有什么不同?一个比另一个更受欢迎吗?或者我应该单独保持良好状态,并确保在我的计划中始终如一地使用其中一种?

+0

如果MathHelper没有在幕后调用Math.PI,我会感到惊讶。 – 2009-10-07 02:31:59

回答

11

它们有多相同?如果它们足够接近,这可能仅仅是传统问题,即测试与浮点的相等性几乎是不可能的。

另外,他们是同一类型吗?我的观点是大多数游戏计算都是用浮点数来完成的,Math.PI将会是双精度浮点数。

编辑:MathHelper does indeed use floats

+0

这对测试的平等性来说并不是一个问题,因为我发现我看到了差异,如果它们相同,结果应该是0.000000000。 改为: MathHelper.Pi - Math.PI = 8.74227801261895E-08。 这对我需要测试的东西肯定足够接近。我只是好奇他们为什么会不同。但是,我同意,它必须是浮动与双重问题。 – SuperSized 2009-10-07 03:21:36

+1

这是关闭了10^-8可能表示float-> double的精度差异,具体来说浮点数只能精确到7-8位数。 – CoderTao 2009-10-07 12:45:11

7

查找到数字:

3,1415926535897900000000000000000 // Math.PI

3,1415930000000000000000000000000 // MathHelper.PI

3,1415926535897932384626433832795 // PI从Windows Calc


1,5707963267949000000000000000000 // Math.PI/2

1,5707963705062900000000000000000 // MathHelper.PiOver2

1,5707960000000000000000000000000 // MathHelper.Pi/2

1,5707963267948966192313216916398 // PI/2从的Windows计算器


的问题说明:精度

损失

最佳PI/2 = Math.PI/2

+0

Pi to 10000 dp:http://joyofpi.com/pi.html – 2009-10-07 09:55:34

+0

谢谢你的好链接 – AndreyAkinshin 2009-10-07 15:59:14

3

最好的PI/2不是Math.PI/2!

在游戏开发中不要使用Math.PI常量,精确度的损失可以忽略不计,你不会看到游戏对象移动的不同......性能更重要。使用MathHelper.PiOver2将为您节省双倍分割和双倍浮动转换。这可能似乎没什么帮助,但是存在差别很大的计算密集型问题(粒子系统)。