1

単純な電卓アプリケーションを作成するとします。このアプリケーションは、次のような単純なものを計算するだけです。

1.5 + 30 + 9755-30-200000 + 999900.54

浮動小数点数を使用するときに精度の問題があったことを少し覚えています。電卓アプリが間違った結果を作成し始めるのはどの時点ですか?ほとんどの場合、1 + 2-963422のような整数を計算するだけですが、浮動小数点数を入力することもあります。精度の問題がどこで効果を発揮し始めるかについて、私には大きな手がかりがありません。そのダブルの最後の数字だけですか?-963419.0000000000003655のように?またはそれはどのように見えますか?そして、それらを捕まえる方法はありますか?

4

6 に答える 6

5

ウィキペディアの引用:

桁落ち、πや0.1などの数値を正確に表現できないこと、およびその他のわずかな不正確さに加えて、次の現象が発生する可能性があります。

  • キャンセル:ほぼ等しいオペランドを減算すると、精度が極端に低下する可能性があります。これはおそらく最も一般的で深刻な精度の問題です。
  • 整数への変換は直感的ではありません。(63.0 / 9.0)を整数に変換すると7になりますが、(0.63 / 0.09)に変換すると6になる場合があります。これは、変換が一般に丸めではなく切り捨てられるためです。床関数と天井関数は、直感的に期待される値から1つずれた答えを生成する場合があります。
  • 指数範囲が制限されている:結果がオーバーフローして無限大になるか、アンダーフローによって非正規化数またはゼロになる可能性があります。このような場合、精度が失われます。
  • 安全な除算のテストには問題があります。除数がゼロでないことを確認しても、除算がオーバーフローして無限大になることは保証されません。
  • 平等のテストには問題があります。数学的に等しい2つの計算シーケンスは、異なる浮動小数点値を生成する可能性があります。プログラマーは、ある程度の許容範囲内で比較を実行することがよくあります(多くの場合、10進定数であり、それ自体は正確に表されていません)が、必ずしも問題が解決するわけではありません。

このような問題を回避するには、エラーの伝播を最小限に抑えるために特定の計算を分析する必要があります。

于 2009-08-16T16:40:22.100 に答える
1

浮動小数点の精度の「問題」は、すべての浮動小数点計算に常に存在します。

運が良ければ、2の累乗のみを含む数値で作業していることもあります。x.25、y.125など。小数点の右側の部分は、任意の整数に対して1 /(2 ^ k )です。 k

小数点以下の桁数が2の累乗ではない値を使用する場合、表現の問題が発生します。1./3。、1./5.、1./6.、1./7.、1./9。など

浮動小数点表現の問題は、2の累乗以外のすべての値で発生します。

于 2009-08-16T14:57:41.273 に答える
1

浮動小数点演算には落とし穴がたくさんあります。ここにあなたが気をつけるべきいくつかがあります:

1)非常に大きい数と非常に小さい(絶対値で)数値を追加します。IEEE-754単精度浮動小数点数の精度は、10進数で約7桁です。したがって、1000000.0 + 3.14159を計算しようとすると、小数点以下のほとんどの桁が失われます。これは、単純なアルゴリズムを使用して大きな配列(数百万の小さな値)の現在の合計を計算する場合に発生する可能性があります。それを行うためのより良い方法を見つけるには、カハンの加算をチェックしてください。

2)2つの大きく、ほぼ等しい数を引くことにも同様の問題があります。結果には、有効数字が1つか2つしかない場合があります。繰り返しになりますが、解決策は、「マウスを取得するために2頭の象を引く」ことを回避する方法で計算を再配置することです。

于 2009-08-16T16:15:03.097 に答える
0

「いつ」と言うのは難しいです。それはあなたの数がどれだけ大きいか小さいか、あなたが行う操作の数、そしてあなたが必要とする精度に依存します。

一部の言語は、正確な10進演算を処理するための特別なオブジェクト/構成をサポートしています。JavaにはBigDecimalがあります:http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html

于 2009-08-16T15:28:54.143 に答える
0

試してみてください0.1 + 0.2 - 0.3

于 2009-08-16T16:24:01.797 に答える
0

実際の例として、IEEE754 32ビット(単精度)浮動小数点では、整数は16777216までしか表現できず、それを超えるとギャップが生じます。16777216の次の浮動小数点数は16777218です。

于 2009-08-17T11:54:46.557 に答える