2011-12-15 19 views
4

私はMicrosoft Visual C++ 6.0で書かれたアプリケーションを持っています。今、Visual Studio 2010でC#を使用してアプリケーションを書き直しましたが、精度の問題が原因で結果が一致しません。このような精度の問題の1つは次のものです。Visual Studio 2010の精度問題

float a = 1.0f; 

float b = 3.0f; 

float c = a/b; 

これは、Visual Studioで実行すると2010は、Visual Cで実行した場合、値の定義の値の後にFを削除する、= 0.333333343

しかし、同じコードをc値を与えるC#コードである++ 6.0は、cの値を与えます= 0.333333

誰でもそれを並べ替えて、Visual C++ 6.0と同様にVisual Studioでも同じ値を持つ方法を説明できますか?


実際、値はウォッチウィンドウから取得されます。私は、Visual Studioの異なるバージョンが浮動小数点フォーマットの表現が異なるかもしれないことを知りました。したがって、時計の価値は役に立たないかもしれません。これが私がVisual Studioの両方のバージョンで値を印刷した理由です。その結果は次のとおりです。 Visual C++言語を使用してのVisual Studio 6.0と それは0.333333(6 3の)

ですが、C#言語を使用してVisual Studioの10でそれは0.3333333である(7 3の)

だから、誰もに私のC#のプログラムを作るために私を助けることができますVisual C++と同じ結果を生成する??? (つまり、両方のバージョンで同じ結果を生成する浮動小数点演算を作るにはどうすればよいでしょうか)

+2

どのように値を調べていますか?私は確信しています(私が間違っていて、C#がシーンの裏に 'double 'を使用していない限り)内部表現は同じですが、ユーザに数字を表示する方法は異なりますので、単に異なる表示のデフォルトを見ることができます。 –

+0

@MrLister C#4.0仕様書では、4.1.6節で浮動小数点数のバイナリ演算は少なくとも* floatの範囲と精度を使用して実行されることが強調されています。つまり、背後の精度は実装定義です。 .NET Frameworkでは、背後で倍精度を使用することがあります。 – phoog

答えて

15

正確な値は0.3回繰り返され、どちらも「正解」ではありません。一致する正確な結果のバイナリ浮動小数点計算の結果は、一般的に彼らが動作する方法で開始することは悪い考えです。 (いくつかの詳細についてはbinary floating point in .NETに私の記事を参照してください。)

それはあなたが最初の場所で2進浮動小数点を使用すべきではない可能です(例えば、あなたの値が正確に表現するならば、そのようなお金などの人工量)。あるいは、特定の許容誤差で等価比較を行うだけでよい場合もあります。

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

+0

Visual C++で0.333333(6 3)、C#で0.3333333(7 3)という値を両方出力しました。これはエラーがあることを意味しています。 Visual C++ 6.0とVisual Studio 10をC#で作成すると、同じ結果が得られますか? – Mahesh

+0

@Mahesh:いいえ、エラーがあるわけではありません。私は、それぞれの場合に関わるテキストを探しているだけであると考えています。 –

5

C#は単純に小数点以下を表示しています。 0.333333343は有効数字6桁に丸められて0.333333です。基になるcの値は同じです。

さらに精度を上げたい場合は、常にdouble個の変数を使用できます。

3

C#浮動小数点はfloatdoubleタイプで処理できます。 A floatタイプの精度は7桁で、double 16.

私はC++の標準精度は約16桁(平均15.9!)だと信じています。

いずれにしても、1/3が0.333回繰り返されるため、いずれの表現も算術的に正しくありません。

私はそれがあなたが見ている値の表現であると考えています(デバッガが値を文字列に変換して表示することに注意してください)。それぞれのメモリ位置を調べると、

1

あなたの質問に対する答えは、同じ出力が必要なときは、表示方法が互換性があることを確認するだけです。
たとえば、Cの場合はprintf("%9.7f", result)、C#の場合はstring.Format("{0:0.0000000}", result)です。すべてです。

関連する問題