6

Double データ型は、基数 10 の一部の値を正しく表すことができません。これは、浮動小数点数が実数を表す方法によるものです。これが意味することは、通貨の値を表すときは、エラーを防ぐために 10 進数の値の型を使用する必要があるということです。(このプリアンブルの誤りを自由に修正してください)

私が知りたいのは、標準の .Net フレームワーク (違いがある場合は C#) の 64 ビット アーキテクチャで、Double データ型の下でこのような問題を引き起こす値は何ですか?

答えは、そのような値を見つけるための式またはルールであると期待していますが、値の例もいくつか欲しいです。

4

4 に答える 4

7

2 の正負の累乗の合計として記述できない数値は、2 進浮動小数点数として正確に表すことはできません。

浮動小数点数の 32 ビットおよび 64 ビット表現の一般的なIEEE 形式には、さらに制約があります。仮数と指数の両方で 2 進数の桁数を制限します。したがって、表現可能な最大値と最小値 (メモリが機能する場合は約 +/- 10^308 (基数 10)) があり、表現できる数値の精度には制限があります。この精度の制限は、64 ビット数の場合、2 の最大累乗の指数と数の最小累乗の差が 52 に制限されることを意味します。したがって、数値に 2^52 の項が含まれている場合は、 2^-1 にも項を含めないでください。

2 進浮動小数点数で正確に表現できない数値の簡単な例としては1/3、 、2/31/5.

浮動小数点数の集合は (どのような表現においても) 有限であり、実数の集合は無限であるため、浮動小数点数として正確に表現できない実数を見つける 1 つのアルゴリズムは、次の実数を選択することです。ランダム。実数が浮動小数点数として正確に表現できる確率は です0

于 2012-08-28T18:37:50.440 に答える
3

double通常、 に格納する値に多少の誤差が生じる可能性に備えておく必要があります。定数値を保存している場合を除き、少なくとも何らかのエラーが発生している可能性があります。エラーが発生しないことが不可欠であり、値が一定でない場合は、おそらく浮動小数点型を使用しないでください。

多くの場合、「マイナーな浮動小数点エラーをどのように処理すればよいですか?」という質問をする必要があります。どのタイプの操作で多くのエラーが発生する可能性があり、どのタイプがそうでないかを知りたいと思うでしょう。「等しい」という 2 つの値を比較すると、正確に等しいのではなく、「十分に近い」ことを実際に確認する必要があります。

于 2012-08-28T18:29:36.550 に答える
1

この質問は、実際には単一のプログラミング言語やプラットフォームを超えています。不正確さは、実際にはバイナリ データに固有のものです。

double の場合、小数点の左側 (0 ベースのインデックス I) の各数値 N は値 N * 2^I を表し、小数点の右側のすべての桁は値 N * 2^( -私)。

例として、5.625 (基数 10) は 101.101 (基数 2) になります。

この計算を考えると、I の異なる値に対して 2^(-I) の合計として計算できない 10 進数の値は、double として誤った値になります。

于 2012-08-28T18:26:47.557 に答える
1

float は として表され、s次の式ではem

s * m * 2^e

これは、与えられた式を使用して (および と のそれぞれのドメインで) 表現できない数値は正確sに表現できないことを意味します。em

基本的に、 と の間のすべての数値を特定の 2 の累乗 (負の累乗の可能性があります)0で乗算して表すことができます。2^53 - 1

0例として、との間のすべての数値はで2^53 - 1乗算して表すことができます2^0 = 12また、これらすべての数値を(.5分数で)で割って表すこともできます。等々。

この回答はトピックを完全にはカバーしていませんが、お役に立てば幸いです。

于 2012-08-28T18:42:19.270 に答える