2012-04-17 13 views
1

IEEE浮動小数点演算の1つの重要な特性の1つは、制限されたビット数とベース2形式による計算で「エラー」が発生することです。浮動小数点計算における誤差の推定

など。 C#で:

(Math.PI * 1e20/1e20) == Math.PI; // false 

これらの操作のエラーの大きさを判断する方法はありますか? .NETはDouble.Epsilonフィールドに0より大きい最小有意値を与えますが、非ゼロ数値の比較には関係ありません。

編集:正確にに誤差を計算する方法を求めていないので、私はその大きさを推定する方法を見つけようとしています。例えば

(再度、C#で):

(1e20 + 1e3) == 1e20; // true 
(1e20 + 1e4) == 1e20; // false 

だから操作1e20 + Xの誤差がdoublesが小数精度の最大17桁の数字を持っているので、意味が約1E3、であるように見えます。

+1

私はあなたの計算に基づいて誤差の見積もりを計算する必要があると思います。ここで役立つ情報があります:http://stackoverflow.com/questions/3166851/estimating-error-on-calculations-using-decimals –

+0

エラーは離散的で累積的で、計算ごとに発生する場合と発生しない場合があります。すべての計算で正確な誤差を予測または計算するには非常に時間がかかります(これを行うには、ソフトウェア計算を別の任意の精度で行う必要があります)。また、80ビットの拡張精度浮動小数点をサポートするdelphiのようなものでこれを行うこともできます。 –

+0

@ルーカス:「あなたの計算に基づいてエラー推定を計算する」とはどういう意味ですか? –

答えて

0

あなたが必要とするのは、最小の(デノルム)正の数ではなく、マシンのイプシロン(計算可能)です。奇妙な命名規則については、http://www.johndcook.com/blog/2010/06/08/c-math-gotchas/を参照してください。

マシンのイプシロンを取得したら、基本的な代数演算*、+、/、 - は、ε以下の相対誤差を持つことを知っています(IEEE標準から)x flop y =(x op y )(1 + delta)ここで、

  • flopは浮動小数点演算です。浮動小数点加算
  • opは実数演算の対応する演算です
  • deltaは相対的な丸め誤差であり、| delta |で囲まれます。 < =イプシロン
関連する問題