1

編集:バグを再現するために、自宅で仕事をしていたのと同じコードを書きました。これは正確なコードです!!

c++ から c# に浮動小数点数を渡そうとしていますが、中間として c++ CLI を使用しています。C++ cli に次の関数があります

void myclass::getFloats(float% f1, float %f2)
{
    float f11=734212.384f;
    float f22=467474.26675f;
    f1=f11;
    f2=f22;
}

関数の最後にブレークポイントを置いてそこで停止すると、次のことがわかります。

  • f1 は : 734212.38 を保持します。
  • f2 は : 467474.28 を保持します。

浮動小数点の制限により問題ないと思います。

しかし、スコープが終了し、この関数を呼び出した C# コードに戻ると、次のようになります。

myclass m = new myclass();
float f1=0, f2=0;
m.getFloats(ref f1, ref f2);

そして、getFloat 関数の後に停止します。

  • f1 は 734212.4 を保持します
  • f2 は 467474.281 を保持します

なぜこれが起こっているのか、私には手がかりがありません。なぜ最初の数字で彼は 0.38 を 0.4 に切り上げ、2 番目の数字では切り上げずに 0.001 を追加したのですか?

どんな助けでも大歓迎です、前もって感謝します

4

2 に答える 2

0

浮動小数点モードが原因だと思います。ネイティブ C++ では、コンパイラ オプション /fp を使用して、 fast、precision、strict の3 つの浮動モードを指定できます。デフォルトでは、ネイティブ C++ プロジェクトは fp:precise; を使用します。この投稿によると、マネージド コードは fp:fast と同等のものを使用します。fp:fast は fp:precise よりも精度が低いですが、これが問題の原因だと思います。

ネイティブ C++ で fp:fast を指定して、この問題を修正できるかどうかを確認できます。

参考までに、Microsoft Visual C++ Floating-Point Optimization

于 2013-08-21T13:08:44.957 に答える