0

仮数に格納されているものにしか依存できないため、浮動小数点での精度の意味を理解していると思います。

私の理解が正しければ、0に0.000001を100000回足すと、エラーが発生し始める可能性があります。

このエラーを防ぐ方法、予測する方法、または 32 ビット浮動小数点数を少なくして軽減する方法はありますか?

編集: たとえば、スタークラフト 2 では、ユニットの命令のみが伝達され、ゲームの状態は伝達されません。それでも、すべてのプレイヤーは同じものを見ています。浮動小数点エラーの蓄積は回避されますが、どのように、どのようなコストまたは制約で?

4

2 に答える 2

0

防ぐために

多精度浮動小数点ライブラリ (10 進定数が常に正確に表現されることが重要かどうかに応じて 2 進または 10 進)、または有理数の実装を使用します。

予想する

これは、数値安定性の技術です。基本的な原則はありますが、プログラミングが必ずしも簡単ではない場合は、それらを念頭に置いてください。二次方程式を解く例を考えてみましょう。

32 ビット float の桁数を減らして軽減する

「数字」と言うときは、おそらく 10 進数を意味します。2 進浮動小数点数について最初に理解しておくべきことは、それが 2 進で表され、10 進数で考えると混乱を招くということです。

その部分をより直接的に答えるために、いくつかの精度を隠すことは問題を隠すだけで、それらを修正しません。ほとんどの場合、それは悪い考えです。


StarCraft 2 の例に関して、IEEE 754 浮動小数点に関する典型的な迷信の 1 つは、同じ計算を実行する 2 台のコンピューター (ネットワーク ゲームの 2 台の StarCaft 2 クライアントなど) で異なる結果が得られるかのように、決定論的ではないというものです。まあ、IEEE 754 は決定論的です。浮動小数点の計算は、実数で行われる同じ計算とは少し異なりますが、各コンピューターのプロセッサが IEEE 754 を正しく実装している限り、2 つの連続した実行または同じバイナリを実行する 2 つの異なるコンピューターの計算は常に同じです。標準(基本的にはこれを行います)。

于 2012-11-21T20:52:57.400 に答える
0

適切に実装された浮動小数点で単一の演算を実行し、丸めモードが最も近い値に丸める (最も一般的な) 場合、誤差は最大で表現可能な数値間の距離の半分です。これは、最も近い値に丸めるモードでは、演算が正確な数学的結果に最も近い表現可能な結果を​​返すためです。(これを「正丸め」といいます。)

これには、数値 (「0.000001」や「1e-5」など) を浮動小数点に変換するなどの操作が含まれます。ただし、一部の演算、特に正弦や対数などの複雑な演算のライブラリ ルーチンでは、通常、正しく丸められた結果が返されるとは限りません (そうするのが難しいため)。したがって、誤差範囲に依存する前に、実装の仕様を確認する必要があります。

32 ビット IEEE 754 浮動小数点は、符号ビット、8 つの指数ビット (-126 から 127 までの [2 の] 通常の指数を表す)、および 23 の明示的な仮数ビットを使用します。(適切な用語は仮数です。仮数は対数の小数部分です。) 完全な仮数は 24 ビットを持ちます。これは、暗黙的な先行 1 があるためです (大きさが 2 -126未満の非正規数を除く)。したがって、表現可能な数値と次に高い表現可能な数値との間の距離は、先頭の 1 ビットの値の 2 ~23倍になります。もちろん、その値は、数値より大きくない最大の 2 の累乗です。(たとえば、5 の場合、先行ビットの値は 4 であるため、最下位ビットの値は 4•2 -23 = 2 -21です。. したがって、1 回の演算の正確な数学的結果が約 5 である場合、最大誤差は 2 -22になります。)

複数の操作を実行する場合、エラーは実行される操作と関連する値に大きく依存します。エラー境界を決定するには、慎重な分析を実行する必要があります。操作によっては、誤差が結合して拡大し、誤差が無限大になることさえあります。

0.000001 を 100,000 回追加しようとすると、2 種類のエラーが発生することに注意してください。まず、0.000001 は 2 進浮動小数点では正確に表現できないため、その数値を浮動小数点に変換する操作でエラーが発生します。第 2 に、加算ごとに丸め誤差が発生する可能性があります。

また、異なるプロセスで同一の情報を維持することにも言及しています。これは、重複していますが、境界エラーとは別の問題です。プロセスが同一のプラットフォームで実行されている場合、同一のハードウェアとライブラリを使用して、同一のデータで同一の操作をすべてのプロセスに実行させることにより、同期を維持することは難しくありません。これは、浮動小数点エラーが通常ランダムではないためです。同じデータに対して同じ操作を実行すると、常に同じ結果が返されます。(ハードウェアまたはライブラリの動作が完全に指定されておらず、関係のないデータに依存することが許可されている場合、問題が発生する可能性がありますが、これは実際の問題よりも理論的な問題になる傾向があります。) 同一のプラットフォームは完全に同一であることを意味することに注意してください。

プロセスが異なるプラットフォームで実行されている場合、同期を維持するのが難しい場合があります。同一のソースからコンパイルされたソフトウェアで実行している場合でも、コンパイラは浮動小数点演算のさまざまな選択肢を使用して高水準言語を実装する場合があります。最も悪名高いのは、一部の言語で許可されている高水準言語が必要とするよりも高い精度を使用することです。

IEEE 754-2008 標準の第 11 項には、再現可能な浮動小数点の結果の生成に関する情報が含まれています。コンピューティング プラットフォームは、これをサポートするために必要な保証を提供しない場合があります。

于 2012-11-21T20:51:59.647 に答える