开发者

C# Math vs. XNA MathHelper

开发者 https://www.devze.com 2022-12-08 09:32 出处:网络
Ever since I needed to work with PI (3.1415...) in C# I have used Math.PI to get the value.Usually I would just use values like Math.PI/2.0 or 2.0*Math.PI, but now I have just noticed that XNA provide

Ever since I needed to work with PI (3.1415...) in C# I have used Math.PI to get the value. Usually I would just use values like Math.PI/2.0 or 2.0*Math.PI, but now I have just noticed that XNA provides a MathHelper class. The nice thing about this is I can call MathHelper.PiOver2 and MathHelper.TwoPi, thus making an extremely trivial step even more trivial. ;-)

I assumed these two classes were interchangable, but I noticed that Math.PI/2.0 != MathHelper.PiOver2. I tried to research why this would be, but I found nothing. So, I thought I would try my luck here. With regards to using PI, are there any differences between th开发者_如何学编程e Math class and the MathHelper class? Is one preferred over the other? Or should I just leave well enough alone and just make sure to consistently use one or the other throughout my program?


How not equal are they? If they are sufficiently close, this might just be the traditional problem that testing equality with floating points is near impossible.

Also, are they of the same type? My opinion was most gaming calculations were done with floats, where as Math.PI would be a double.

EDIT: MathHelper does indeed use floats


Look to digit:

3,1415926535897900000000000000000 // Math.PI

3,1415930000000000000000000000000 // MathHelper.PI

3,1415926535897932384626433832795 // PI from Windows Calc


1,5707963267949000000000000000000 // Math.PI / 2

1,5707963705062900000000000000000 // MathHelper.PiOver2

1,5707960000000000000000000000000 // MathHelper.Pi / 2

1,5707963267948966192313216916398 // PI / 2 from Windows Calc


Explanation of problem: The loss in accuracy

Best PI / 2 = Math.PI / 2


Best PI/2 is not Math.PI/2!

In game development don't use the Math.PI constant, the loss of accuracy is negligible, you won't see the difference in the movement of your game objects... The performance is more important. Using the MathHelper.PiOver2 will save you a double division and a double to float conversion. This might seems to be very little help, but there are computationally intensive problems (particle systems) where the difference is significant.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号