10

C# で PI (3.1415...) を使用する必要があったので、Math.PI を使用して値を取得しました。Math.PI/2.0通常はまたはのような値を使用します2.0*Math.PIが、XNA が MathHelper クラスを提供していることに気付きました。MathHelper.PiOver2これの良いところは、 andを呼び出すことができるMathHelper.TwoPiため、非常に些細なステップがさらに些細なことになります。;-)

この 2 つのクラスは互換性があると思っていましたが、気付きましたMath.PI/2.0 != MathHelper.PiOver2。これがなぜなのか調べてみましたが、何も見つかりませんでした。だから、ここで運を試してみようと思いました。PI の使用に関して、Math クラスと MathHelper クラスに違いはありますか? どちらが優先されますか?それとも、十分に放っておき、プログラム全体でどちらか一方を一貫して使用するようにする必要がありますか?

4

3 に答える 3

12

それらはどのように等しくないのですか? それらが十分に近い場合、これは、浮動小数点との等価性をテストすることがほぼ不可能であるという従来の問題である可能性があります。

また、それらは同じタイプですか?私の意見では、ほとんどのゲーム計算は float で行われ、Math.PI は double でした。

編集: MathHelper は実際にフロートを使用します

于 2009-10-07T02:36:09.927 に答える
8

数字を見てください:

3,1415926535897900000000000000000 // Math.PI

3,141593000000000000000000000000 // MathHelper.PI

3,1415926535897932384626433832795 // Windows Calc の PI


1,570796326794900000000000000000 // Math.PI / 2

1,5707963705062900000000000000000 // MathHelper.PiOver2

1,5707960000000000000000000000000 // MathHelper.Pi / 2

1,5707963267948966192313216916398 // Windows Calc からの PI / 2


問題の説明: 精度の低下

最良の PI / 2 = Math.PI / 2

于 2009-10-07T02:52:51.140 に答える
3

最高の PI/2 は Math.PI/2 ではありません!

ゲーム開発では、Math.PI 定数を使用しないでください。精度の低下は無視できます。ゲーム オブジェクトの動きに違いは見られません。パフォーマンスの方が重要です。MathHelper.PiOver2 を使用すると、2 つの除算と double から float への変換が節約されます。これはほとんど役に立たないように思えるかもしれませんが、計算集約型の問題 (粒子システム) では違いが大きくなります。

于 2011-07-28T18:29:07.863 に答える