11

.NET アプリケーション (C# など) での浮動小数点計算が常に同じビット単位の正確な結果を生成することを保証するにはどうすればよいですか? 特に、異なるバージョンの .NET を使用し、異なるプラットフォーム (x86 と x86_64) で実行している場合。浮動小数点演算の不正確さは問題ではありません。

Java では、strictfp を使用します。C/C++ やその他の低レベル言語では、この問題は基本的に FPU/SSE 制御レジスタにアクセスすることで解決されますが、.NET ではおそらく不可能です。

FPU 制御レジスタを制御しても、.NET の JIT は異なるプラットフォームで異なるコードを生成します。この場合、ホットスポットのようなものはさらに悪いでしょう...

なぜそれが必要なのですか?高速浮動小数点演算とロック ステップ シミュレーションに大きく依存するリアルタイム ストラテジー (RTS) ゲームを作成することを考えています。基本的に、ネットワーク経由でユーザー入力のみを送信します。これは、ユーザー入力を保存することでリプレイを実装する他のゲームにも当てはまります。

オプションではありません:

  • 小数(遅すぎる)
  • 固定小数点値 (sqrt、sin、cos、tan、atan を使用すると遅すぎて扱いにくい...)
  • FPS のようにネットワーク全体で状態を更新する: 数百または数千のユニットの位置情報を送信することはオプションではありません

何か案は?

4

3 に答える 3

2

あなたの質問に対する正確な答えはわかりませんが、C++ を使用して c++ dll ですべてのフロート作業を行い、interopt を介して結果を .Net に返すことができます。

于 2010-03-04T16:59:03.273 に答える
1

異なるプラットフォームでの Bitexact の結果は、a** の苦痛です。x86 のみを使用する場合は、FPU が 32 ビットから 64 ビットに変更されないため、問題にはなりません。しかし問題は、新しいプロセッサでは超越関数がより正確になる可能性があることです。

4 つの基本操作で異なる結果が得られることはありませんが、VM が式を最適化し、異なる結果が得られる場合があります。したがって、Ants が提案したように、安全のために、add/mul/div/sub ルーチンをアンマネージ コードとして記述します。

超越関数については、ルックアップ テーブルを使用してビットの正確性を保証する必要があります。たとえば 4096 値の結果を計算し、それらを定数として保存し、それらの間の値が必要な場合は補間します。これは高い精度を提供するわけではありませんが、bitexact になります。

于 2010-03-11T21:24:10.733 に答える