AIX と Linux で複雑なアプリケーションを実行しようとしているシナリオがあります。
実行中、コードは組み込み関数 sqrt() を使用して計算しますが、得られる結果は両方のマシンで異なります。
この動作の理由を知っている人はいますか? とにかくこれを克服する方法はありますか?
PS
一部の値は両方のマシンで同じですが、それらの大部分は異なります。
AIX と Linux で複雑なアプリケーションを実行しようとしているシナリオがあります。
実行中、コードは組み込み関数 sqrt() を使用して計算しますが、得られる結果は両方のマシンで異なります。
この動作の理由を知っている人はいますか? とにかくこれを克服する方法はありますか?
PS
一部の値は両方のマシンで同じですが、それらの大部分は異なります。
IEEE 754 仕様に準拠するプロセッサは、平方根の正確な結果を返さなければなりません (または、正確に表現できない場合は正しく丸められます)。同じ入力値、浮動小数点形式、および丸めモードの場合、IEEE 754 準拠の異なるプロセッサが同じ結果を返す必要があります。変更は許可されません。異なる結果が表示される理由として考えられるのは、次のとおりです。
バイナリ出力を比較して、印刷フォーマットのバグや違いの可能性を排除しましたか?
現在、ほとんどのプロセッサは IEEE 754 浮動小数点をサポートしています。IEEE 754 の精度が保証されていない例として、OpenCL の native_sqrt 関数があります。OpenCL は (IEEE 754 準拠の sqrt に加えて) native_sqrt を定義しているため、必要に応じて速度と精度を交換できます。
今日、IEEE 754 sqrt 実装のバグはあまり一般的ではありません。IEEE 754 sqrt 関数の難しいケースは、丸めモードが最も近くに設定されていて、実際の結果が 2 つの浮動小数点表現の中間点に非常に近い場合です。これらの困難な平方根の引数を生成する方法は、William Kahan の論文How to Test whether SQRT is Rounded Correctly に記載されています。
2 つのコンピューターのハードウェアの数値表現、または 2 つのコンパイラーの sqrt 関数に使用されるアルゴリズムにわずかな違いがある場合があります。有限精度演算は、実数の演算と同じではなく、計算のわずかな違いが予想されます。違いが異常かどうかを判断するには、使用している数値型 (ChuckCottrill の質問による) を述べ、例を挙げてください。相対的な違いは何ですか。次数 1 の値の場合、1E-9 は単精度浮動小数点の予想差です。
各 CPU で使用可能な浮動小数点形式を確認してください。単精度または倍精度の浮動小数点を使用していますか? 同等/類似の回答が必要な場合は、両方のマシンで同様の精度の浮動小数点形式を使用する必要があります。
浮動小数点は近似値です。単精度浮動小数点は、仮数に 24 ビット (符号ビットを含む) のみを使用し、残りの 8 ビットを指数に使用します。これにより、約 8 桁の精度が可能になります。倍精度浮動小数点は 53 ビットを使用するため、より高い精度が可能になります。
2 つのシステムでの異なる浮動小数点数のバイナリ値と、これらの値の印刷表現に関する詳細が不足しているため、丸めまたは表現の違いがあります。