4

Microsoft Visual C++ 6.0 で作成されたアプリケーションがあります。Visual Studio 2010 で C# を使用してアプリケーションを書き直しましたが、精度の問題により結果が一致しません。そのような精度の問題の 1 つに、次のようなものがあります。

float a = 1.0f;

float b = 3.0f;

float c = a / b;

これは、Visual Studio 2010 で実行した場合の C# コードです。c値 =0.333333343

ただし、同じコードを値定義の値の後に f を削除すると、Visual C++ 6.0 で実行すると c value = が得られます0.333333

誰かがそれを整理して、Visual Studio と Visual C++ 6.0 で c の値を同じにする方法を説明できますか??


実際には、値はウォッチ ウィンドウから取得されます。Visual Studio のバージョンによって、浮動小数点形式の表現が異なる場合があることを知りました。したがって、watch の値は役に立たない場合があります。これが、Visual Studio の両方のバージョンで値を出力した理由であり、結果は次のとおりです。Visual C++ 言語を使用する Visual Studio 6.0 では、0.333333 (6 つの 3) です。

しかし、C# 言語を使用する Visual Studio 10 では、0.3333333 (7 つの 3) です。

では、ビジュアル C++ と同じ結果を生成するように C# プログラムを作成するのを手伝ってくれる人はいますか? (つまり、両方のバージョンで同じ結果を生成するためにフローティング操作を行うにはどうすればよいですか???)

4

4 に答える 4

15

正確な値が 0.3 の繰り返しであることを考えると、どちらも「正しい」わけではありません。また、2 進浮動小数点計算の正確な結果を一致させようとしている場合は、その動作方法のために、一般的に最初から始めるのはお勧めできません。(詳細については、.NET のバイナリ浮動小数点に関する私の記事を参照してください。)

そもそもバイナリ浮動小数点を使用すべきではない可能性があります (たとえば、値が正確で人為的な金額 (お金など) を表している場合) あるいは、特定の許容範囲で等値比較のみを行う必要がある可能性もあります。

C# と C がまったく同じビット パターンを生成している可能性もありますが、これらの値がどのようにフォーマットされているかにより、異なる結果が表示されます。繰り返しますが、比較に数値のテキスト表現は使用しません。

于 2011-12-15T12:34:23.690 に答える
5

C#小数点以下の桁数が少ないだけです。0.333333343は有効数字六桁で四捨五入0.333333。の基本的な値cは同じです。

もちろん、より精度が必要な場合は、いつでもdouble変数を使用できます。

于 2011-12-15T12:41:08.503 に答える
3

floatC# の浮動小数点はand型で処理できdoubleます。型のfloat精度は 7 桁とdouble16 桁です。

C++ 標準の精度は約 16 桁 (平均で 15.9 桁!) だと思います。

いずれにせよ、1/3 は 0.333 の繰り返しであるため、どちらの表現も算術的に正しくありません。

表示されている値の表現にすぎないと思います (デバッガーは表示のために値を文字列に変換することに注意してください。それぞれのメモリの場所を確認すると、おそらく値が同じであることがわかります。

于 2011-12-15T12:43:43.910 に答える
1

簡単に確認すると、はい、数字がまったく同じであることがわかります。したがって、あなたの質問に対する答えは、同じ出力が必要な場合は、表示方法に互換性があることを確認するだけです。
たとえば、printf("%9.7f", result)C やstring.Format("{0:0.0000000}", result)C# などです。それで全部です。

于 2011-12-15T12:54:53.090 に答える