10

自从我需要在 C# 中使用 PI (3.1415...) 以来,我一直使用 Math.PI 来获取值。通常我只会使用Math.PI/2.0or之类的值2.0*Math.PI,但现在我刚刚注意到 XNA 提供了一个 MathHelper 类。这样做的好处是我可以调用MathHelper.PiOver2and MathHelper.TwoPi,从而使一个极其微不足道的步骤变得更加微不足道。;-)

我认为这两个类是可以互换的,但我注意到Math.PI/2.0 != MathHelper.PiOver2. 我试图研究为什么会这样,但我一无所获。所以,我想我会在这里碰碰运气。关于使用 PI,Math 类和 MathHelper 类之间有什么区别吗?一个比另一个更受欢迎吗?还是我应该独自离开,并确保在整个程序中始终使用其中一种?

4

3 回答 3

12

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

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

编辑:MathHelper 确实使用浮点数

于 2009-10-07T02:36:09.927 回答
8

看数字:

3,1415926535897900000000000000000 // Math.PI

3,1415930000000000000000000000000 // MathHelper.PI

3,1415926535897932384626433832795 // 来自 Windows Calc 的 PI


1,5707963267949000000000000000000 // Math.PI / 2

1,5707963705062900000000000000000 // MathHelper.PiOver2

1,5707960000000000000000000000000 // MathHelper.Pi / 2

1,5707963267948966192313216916398 // PI / 2 来自 Windows Calc


问题解释:精度损失

最佳 PI / 2 = Math.PI / 2

于 2009-10-07T02:52:51.140 回答
3

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

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

于 2011-07-28T18:29:07.863 回答