0

Math.Atan2 または C# のクラス インスタンスの問題に類似した問題で、2 つの double を 追加すると間違った結果が返される

それは単純な行です:

public static String DegreeToRadianStr(Double degree)
    {
        Double piBy180 = (Math.PI / 180);

        Double Val = (piBy180 * degree);  // Here it is giving wrong value
    }

piBy180 * 度 = -3.1415926535897931 しかし、Val = -3.1415927410125732

代替テキスト http://www.imagechicken.com/uploads/1262936639009840000.jpg どうすればいいのかまったくわかりません.. これに関していくつか質問してください。

piBy180 が正しい値を保っているのはすごいことです。

他の関数でも同じことが起こっていますが、正しい値を取得するために操作した方法があります。

MS Visual Studio の C#.net SP1 を使用しています。

4

4 に答える 4

3

その価値を教えていただければdegree、問題の再現を試みることができます...

三つのこと:

  • 浮動小数点演算では、ある程度のエラーが予想されます。私はこれほど多くは期待していませんが、正確な値を見ることは期待していません。
  • 通常、文字列変換では正確な値は表示されません。この種のことを診断するのに役立つメソッドを含むファイル(DoubleConverter.cs )があります。ToExactString
  • アプリはDirectXを使用していますか?これにより、コードにdoubleが含まれている場合でも、32ビット演算を効果的に使用するようにプロセッサモードを変更できます。それが問題の原因である可能性が最も高いように思われますが、それでも実際には推測にすぎません。

編集:わかりました、それで私が正しく推測したように聞こえます、そしてDirectXがおそらく原因です。CreateFlags.FpuPreserveDeviceコンストラクターに渡して、これを回避することができます。確かに、これによりDirectXのパフォーマンスが低下しますが、これはトレードオフであり、自分で検討する必要があります。

于 2010-01-08T07:03:39.737 に答える
2

文字列のフォーマットの問題である可能性があります。次の行を追加してみてください。

Debug.Assert(Val == (piBy180 * degree), "WTF?");

割り当て後。どちらもdoubleであり、それらに対する算術演算で同じ2進値が生成されるため、失敗することはありません。

于 2010-01-08T06:56:05.987 に答える
0

単なる丸め誤差かもしれませんが、確信が持てません。

浮動小数点演算に関するこの記事をチェックしてください。Fortran 用に書かれていますが、それでも便利です。 http://www.lahey.com/float.htm

于 2010-01-08T06:52:06.313 に答える
0

これは不可能のようです。

piBy180 * 度の値はほぼ正しく計算され、17 番目の有効数字で 2 単位未満ずれています。CPU はこれを行うために乗算を実行する必要があり、誰かが DirectX 呼び出しを悪用して精度を台無しにしようとしても、正確に倍精度で乗算を実行しました。

Val の値は、有効数字の 8 桁目で既に間違っています。Val は double として宣言され、1 マイクロ秒前に計算された double 値が割り当てられます。それ以上の計算は行われません。

これはリリース ビルドですか?C++ ができるように、C# は最新の値を Val に格納することを省略したのではないでしょうか。デバッグ ビルドでは何が行われますか?

于 2010-01-08T07:50:40.357 に答える