【问题标题】:C# Math vs. XNA MathHelperC# 数学与 XNA MathHelper
【发布时间】:2009-10-07 02:28:34
【问题描述】:

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

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

【问题讨论】:

  • 如果 MathHelper 没有在幕后调用 Math.PI,我会感到惊讶。

标签: c# math xna pi


【解决方案1】:

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

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

编辑:MathHelper does indeed use floats

【讨论】:

  • 测试相等性并不是真正的问题,因为我发现这是我查看差异的结果,如果它们相同,结果应该是 0.000000000。相反:MathHelper.Pi - Math.PI = 8.74227801261895E-08。对于我需要测试的内容,这肯定足够接近。我只是好奇为什么它们会有所不同。但是,我同意,这一定是一个浮动与双重问题。
  • 它偏离了 10^-8 可能表明浮点数->精度的双倍差异,特别是浮点数只能精确到大约 7-8 位。
【解决方案2】:

看数字:

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 // 来自 Windows Calc 的 PI / 2


问题说明:准确率损失

最佳 PI / 2 = Math.PI / 2

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-09-13
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 2012-08-25
      • 2022-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多