エミュレーターを作成しており、特定の FPU 状態について、FPU 命令を実行した後の決定論的な FPU の状態であることを知りたいと考えています。FDIV?
x87 命令セットを実装する多くの Intel 互換 CPU アーキテクチャがあります。FPU エミュレーションの正確性をテストするとき、結果の CPU 状態に依存する必要がありますか?
実装が異なると、丸め/計算が異なりますか?
エミュレーターを作成しており、特定の FPU 状態について、FPU 命令を実行した後の決定論的な FPU の状態であることを知りたいと考えています。FDIV?
x87 命令セットを実装する多くの Intel 互換 CPU アーキテクチャがあります。FPU エミュレーションの正確性をテストするとき、結果の CPU 状態に依存する必要がありますか?
実装が異なると、丸め/計算が異なりますか?
はい、x87 FPU は、基本的な操作について決定論的です+
, -
, *
, . たとえば、既定の状態 (全幅仮数および最近接偶数への丸めモード) では、 の結果は、 と の数学的合計の結果に正確に最も近い、表現可能な 80 ビット浮動小数点値になります。/
sqrt
x + y
x
y
互換性のあるチップのメーカーは、上記の操作に対してまったく同じ定義を実装しています。
x87 の命令セットには、純粋な CISC の伝統に則って、数学関数、たとえば正弦 ( FSIN
) の近似値を計算するための高レベルの命令も含まれています。これらの命令の結果は、プロセッサのブランドやモデルによって異なります。エミュレーターでは、おそらく、まだ使用されているこれらの命令の最悪の実装の 1 つと同じくらい良いものを提供するだけで済みます。sinl()
ホスト言語の数学ライブラリの関数の結果を使用する場合、誰も文句を言うべきではありません。これは通常、(の呼び出しではなく、FSIN
明示的な引数の削減と多項式近似FSIN
で実装されているため) よりも優れています。
基本的な FPU 命令に固執し、一貫した結果を生成したい場合は、FPU アルゴリズムに同じコンパイラを使用する場合は、そうする必要があります。これは、FPU ライブラリを適切に初期化する必要があるという事実を考慮していません。
興味がある場合は、この件に関する良い読み物があります: https://randomascii.wordpress.com/2013/07/16/floating-point-determinism .
この記事内の他の記事へのリンクは非常に便利です。