コンピュータが数学演算で同じ結果を得るようにするには、固定小数点を使用する必要がありますか?


9

最近のほとんどのコンピューターは同じ浮動小数点標準に従っていると言われましたが、これは、入力が同じであれば、指定された数学演算ですべて同じ浮動小数点数の答えが得られるということですか?

私はネットワーク上でRTSゲームを作成することを研究していて、何百ものユニットの位置を同期するのは悪い方法のように聞こえるので、私は尋ねます。

したがって、入力のみを送信する場合、すべてのクライアントがこれらの入力からシミュレーションを実行することで同じ結果が得られることを保証する必要があります。

古いRTSゲームでは固定小数点演算が使用されていたと読みましたが、すべてが同じ標準に準拠している場合、現代のコンピューターでもそれが必要かどうかわかりません。また、不正確ではありますが、浮動小数点の結果は同じ入力に対して確定的であるとも言われました(これは、同じ標準に従うすべてのコンピューターが同じ不正確な結果を取得することを意味します)。

同じ浮動小数点の基準に従っても、コンピューターに偏差がありますか?

私はこのゲームをC#で書いていますが、それが重要かどうかはわかりません。


彼らがした場合でも、私はそのためのフロートを使用していないだろう
Telastyn

どういう意味ですか ?何故なの?
WDUK 2018

動作はマップ上の位置に依存する可能性があるため、フロートの使用はとにかく望ましくない場合があります。MinecraftのFar Landsは、より顕著な例です。スポーンポイントから遠くに移動すると、動き、レンダリング、地形の生成に問題が発生します。
アモン

回答:


18

同じ浮動小数点の基準に従っても、コンピューターに偏差がありますか?

残念ながら、特にC#(または別のJITコンパイル済み言語)を使用する場合はそうです。ここで発生する問題は、一部のプロセッサアーキテクチャのJITコンパイルステージが、他のアーキテクチャよりも多くのCPUレジスタを使用するコードを生成することです。これにより、一部のマシンでは特定の操作に拡張浮動小数点精度が使用され、他のマシンでは使用されない状況が発生する可能性があります。これは、doubleを使用するすべての反復計算で、異なる累積丸め誤差が発生する可能性があることを意味します。

それは仮想的な問題ではありません。私は、多かれ少なかれ最新のハードウェア上で、現代のエンジニアリングシミュレーションソフトウェアにおけるそのような逸脱を直接経験しています。この問題により、関連するすべてのマシンでまったく同じ結果を生成する複雑な浮動小数点計算の信頼性の高い回帰テストを作成することが非常に困難になります。


この。いくつかの根本的な原因:IEEE Std 754には、オプションの「should」節(NaN処理など)が含まれており、代替設計(アンダーフロー検出など)を許可しています。言語バインディングが浮動小数点標準をサポートしている限り、たとえばFLT_EVAL_METHODISO C / C ++で、浮動小数点式を評価するときにコンパイラに余裕を与えることができます。超越関数(例えばはsinexplog)主にIEEE浮動小数点標準およびプログラミング言語標準の両方によって規制されていないされています。単純なライブラリバージョンのアップグレード(新しいglibcバージョンなど)では、結果が異なる場合があります。
njuffa 2018

私はゲームで自分でそれを打ちました。ロケットは私のラップトップでうまく飛んだ、私のデスクトップでは飛ばなかった、完全に同一のインストール。
Loren Pechtel 2018

3

浮動小数点エラー

すべての浮動小数点数は、計算に使用されるため、不正確になります。これは、不正確な形式を使用して計算するという単純な事実です。計算は計算の順序にも影響され、可換性は保証されません。つまり(a + b) + c、と同じである場合も、そうでない場合もありますa + (b + c)

さらに、プロセッサは仮数の長さがメモリ規格と同じであるとは限りません。これは、32/64/128ビットの浮動小数点が時々、より多くのビットを持っているかのように動作するため、興味深い動作を生成する可能性があります。

固定小数点エラー

固定小数点演算は、エラーを蓄積する可能性があると言われています。違いは、固定小数点数はどの精度が失われるかについて明確であり、選択した演算によっては丸め誤差を完全に回避できることです。それらは可換性もあり(a + b) + c = a + (b + c)ます。

どっち?

どちらを使用するかは、必要なプロパティに完全に依存します。

浮動小数点数:

  • 非常に細かくなり、極端に次第に離れる、広範囲の値を与えます。
  • 計算の順序に敏感です
  • 時間の経過とともに丸め誤差を累積します。
  • ハードウェア/メモリのフロートサイズの不一致により、動作が不安定になることがあります。

固定小数点数:

  • 2つの連続する数値間の距離が同じである、より小さな範囲の数値を指定します。
  • 計算の順序の影響を受けにくい
  • 丸め誤差についてより明確に
  • 丸めの問題を最小化/回避するために使用できます。

1
「固定小数点数はどの精度が失われるかについて明確です」-浮動小数点も明確です。違いはむしろ固定小数点の不正確さが通常の生命の番号付けより直感的です
whatsisname

1
したがって、固定小数点のみが、ハードウェアなどに関係なくすべてのコンピュータに同じエラー/精度の損失が発生することを保証しますか?
WDUK 2018

1
基本的に、はい。固定小数点数を32ビットまたは64ビットに指定でき、それらはすべてのシステムにあります。浮動小数点数は32ビットまたは64ビットですが、ハードウェアは実際には48ビットまたは96ビットを使用して計算を行い、最後に32ビットまたは64ビットに変換するため、ハードウェアの種類によって違いが生じます。
user1118321

@whatsisname浮動小数点の仕様は非常に明確ですが、この合計で発生する丸めの問題は簡単にはわかりません(a + b * c) / d - eNaN、0による除算、オーバーフロー/アンダーフローなどの明らかな問題を除いて、この式は正しくない可能性があります。さらに、メモリとレジスタの精度の点でのインピーダンス、さらには「同じ」浮動小数点値のメモリからの単純なロード/ストアでも、答えが変わります。
Kain0_0 2018

@ Kain0_0:あなたが正しい、私は浮動小数点の専門家ではないので、私が遭遇することを簡単に伝えることはできません。それがまさに「普通の生命ナンバリングより直感的」と言ったときの意味です。固定小数点が「明確」で浮動小数点が明確でないと言うと、浮動小数点がランダムに不正確に見えるかのように聞こえます。
whatsisname 2018

-1

同一の結果では結果が有用であるという保証はまったくないため、同一の結果を保証する理由は何ですか。

数値的に不安定なアルゴリズムがあり、異なるコンピューターで2つの同一の、しかしまったく無意味な結果を与える可能性があります。違いはあるものの、結果が13桁以内で同じであれば、それははるかに信頼できるものです。

レイアウトエンジンやロスレス圧縮/解凍など、再現性が非常に重要な状況はほとんどありません。固定小数点の使用は見当違いである可能性が非常に高いです。


私はあなたの回答に反対票を投じませんでしたが、OPによって記述されたケースはまさに「再現性が本当に重要である数少ない状況の1つ」であるようです。RTSゲームでは、小さな丸め誤差により、「2つのオブジェクトが衝突した」かどうかが異なります。
ドクターブラウン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.