5

ご存知のとおりdecimal fractions(0.1など)、floating point(doubleやfloatなど)として保存されると、内部的に「バイナリ形式」(IEEE 754)で表されます。また、小数部の中には、バイナリ形式で直接表現できないものもあります。

私が理解していないのは、この「変換」の精度です。

1.)浮動小数点自体に精度(つまり「重要」)を持たせることができますか?

2.)しかし、小数から小数への変換にも精度の低下がありますか?

質問:

小数から浮動小数点への変換時の最悪の場合の精度の低下(「すべての」可能な小数の場合)は何ですか?

(これを知りたい理由は、小数と2進数/浮動小数点の小数を比較するときに、精度を考慮に入れる必要があるためです...両方の数値が同一であるかどうかを判断するためです。この精度を厳密/正確にしたいのです。できるだけ(decimal fraction == binary fraction +/- precision)

例(架空のみ)

0,1 dec => 0,10000001212121212121212 (binary fraction double) => precision loss 0,00000001212121212121212
0,3 dec => 0,300000282828282 (binary fraction double) => precision loss  0,000000282828282
4

5 に答える 5

4

あなたが何を求めているのかは私には完全にはわかりませんが、ハードケースのリストを含む、2進化10進変換に関連する精度の問題の多くについて説明している次の論文に興味があるかもしれません。

バーンパクソンとウィリアムカハン。IEEE10進数-2進数変換をテストするためのプログラム。1991年5月22日 http://www.icir.org/vern/papers/testbase-report.pdf

于 2011-08-24T02:33:37.003 に答える
3

浮動小数点は、大きくなるほど(正と負の両方の方向で)不正確になります。これは、浮動小数点値が指数形式であるためです。

ただし、小数点以下の桁数に関係なく、小数点以下の桁数が増えるほど、小数点以下の桁数はますます正確になります。

したがって、最悪の精度の違いは、使用している浮動小数点タイプの数値制限に向かっています。

于 2011-08-24T02:12:56.640 に答える
1

10進値が表現可能な浮動小数点値の範囲内にあり、言語/実装に正しく丸められた変換がある場合(多くの場合、そうでない場合もあります)、そのような変換によるエラーは、連続する浮動小数点数間の距離、または「ulp」(最後の場所の単位)。

ulpの相対サイズは、正確な2の累乗と次に大きい数値の間で最大になるため、入力が1 + 1/2 ulpよりもわずかに小さい場合、または10進数とdoubleの間の変換の最大相対誤差が達成されます。 2の累乗でスケーリングされた値。このような値の例は次のとおりです。

1.0000000000000001110223024625156540423631668090820312

(これは、1 + 2 ^ -53よりもほぼ無限に小さいです)。

変換による誤差には相対的な限界があるため、この値を2の累乗でスケールアップすると、明らかに絶対誤差が大きくなります。

もちろん、数値が表現可能な値の範囲外にある場合(大きすぎるか小さすぎるため)、すべての精度が失われます。変換、たとえば1e400doubleyields infinity; 実際の入力の痕跡は残っていません。同様に、に変換する1e-400doubleゼロが生成されます。

于 2011-08-24T02:38:27.107 に答える
1

子供を数えるように教えられている方法のために、2進分数の精度特性を完全に理解することは困難です。問題は、分数がカウントシステムのパワーに関してのみである可能性があるということです。言うのは当たり前のようですが、基本的な問題は、10進数で物事を10に分割し、2進数で物事を2(半分)に分割することです。

ほとんどの場合、計算で浮動小数点値が必要になるのは2回あります。それは、通貨値である場合とそうでない場合です。後者は、回転するシャフト上のエンコーダーからの入力から、グラフィックエンジンに渡すための仮想空間内の位置までの範囲である可能性があります。小数値は本当に小数値なので、2進数でも問題ありません。これが、FPUが何年も前に3Dグラフィックスで人気を博した理由の一部です。

問題は、小数部分が実際には離散的な小数単位である通貨の表現にあります。現実の世界では0.01ドル(どのドルかによって異なります)を使用できますが、これを2進数で正確に表すことは困難です。これが、通貨に2進浮動小数点を使用してはならない理由です。

10進数と2進数の浮動小数点を変換して比較しようとしている場合は、変換を行う理由と、比較によって何が達成されるかを調べます。

于 2011-08-24T02:33:20.277 に答える
0

数値が大きくなるほど、精度の低下が大きくなる可能性があります(ただし、指定した数値である可能性があります)。

非常に小さい数をfloatまたはdoubleとしてJavaに格納するだけでなく、9 * 10^105のように非常に大きい数も格納します。

そして、私はこの精度を可能な限り厳密/正確にしたいと思っています

BigDecimalを選択できます。ここでは、取得する精度を指定できますが、もちろん、RAM、CPU時間、JVMの制限によって制限されます。

絶対精度だけに興味がありますか、それとも相対精度に興味がありますか?

次の精度の違いを比較します。

a = 100000000000000,0000000000000001 
b = 100000000000000,0000000000000002

layoutHonkyTonkA= 0,0000000000000001 
layoutHonkyTonkB= 0,0000000000000002

絶対精度の差は同じですが、相対精度の差は大きく異なります。

于 2011-08-24T03:29:07.273 に答える