Linux x86 32 ビット用に開発されたアプリケーションがあります。多くの浮動小数点演算と、結果に応じた多くのテストがあります。現在、x86_64 に移植していますが、このアーキテクチャではテスト結果が異なります。アーキテクチャごとに個別の結果セットを保持したくありません。
記事An Introduction to GCC - for the GNU compilers gcc and g++によると、問題は X86_64 の GCC がfpmath=sseを想定しているのに対し、x86 はfpmath=387を想定していることです。387 FPU はすべての演算に80 ビットの内部精度を使用し、結果を特定の浮動小数点型 (float、double、または long double) にのみ変換しますが、SSE はオペランドの型を使用して内部精度を決定します。
独自のコードをコンパイルするときに-mfpmath=387 を強制でき、すべての操作が正しく機能しますが、ライブラリ関数 (sin、cos、atan2 など) を呼び出すたびに、結果が再び間違っています。libmが fpmath オーバーライドなしでコンパイルされたためだと思います。
387 エミュレーションを使用して自分で libm (glibc) をビルドしようとしましたが、あちこちで多くのクラッシュが発生しました (何か間違ったことをしたかどうかはわかりません)。
プロセス内のすべてのコードが x86_64 で 387 エミュレーションを使用するように強制する方法はありますか? それとも、両方のアーキテクチャで libm と同じ値を返すライブラリがあるのでしょうか? 助言がありますか?
「80ビット精度は必要ですか?」という質問については、個人の運用としては問題ないと言わざるを得ません。この単純なケースでは、違いは非常に小さく、違いはありません。ただし、多くの操作を組み合わせると、エラーが伝播し、最終結果の違いはそれほど小さくなくなり、違いが生じます。だから私は80ビットの精度が必要だと思います。