バグ/ハードウェアの問題を排除するために、2 つの異なるプラットフォーム (Linux と MacOS) で同じ結果が得られる数値パッケージを取得しようとしています。現在の違いの原因は、64 ビットと 80 ビットの倍精度演算では異なると思われます。これを制御するgccのコンパイラオプションがあることは知っていますが、これを設定するための関数呼び出しと、コマンドラインまたはシェル環境で実行できる何かがあると思いました。
何か案は?
バグ/ハードウェアの問題を排除するために、2 つの異なるプラットフォーム (Linux と MacOS) で同じ結果が得られる数値パッケージを取得しようとしています。現在の違いの原因は、64 ビットと 80 ビットの倍精度演算では異なると思われます。これを制御するgccのコンパイラオプションがあることは知っていますが、これを設定するための関数呼び出しと、コマンドラインまたはシェル環境で実行できる何かがあると思いました。
何か案は?
x86 で浮動小数点を使用していると仮定すると、x87 レジスタ FCW のビット 9 ~ 8 を 10b に設定する必要があります。[これは、何らかの理由で Windows がデフォルトで行うことでもあります]。
次のようなものが gcc で動作するはずです。
void set_fp_mode()
{
short mode;
__asm__ __volatile__ ("fstcw %0\n"
"andw $0xFEFF, %0\n" // Clear bit 8.
"orw $0x200, %0\n" // just to be safe, set bit 9.
"fldcw %0\n" : : "m" (mode));
}
[数年前に私が働いていた場所で、新しいコンピューターは古いコンピューターほど浮動小数点数が得意ではないと不満を漏らした人がいて、両方のバイナリ結果のダンプをくれました。私は顧客の古いコンピューターに似たコンピューターと新しいコンピューターに似たコンピューターを手に入れましたが、それを変えることはできませんでした.一方のマシンでは Windows が実行されていて、もう一方のマシンでは実行されていないことに気付くまでは、浮動小数点の結果は「より良い」でした. " Windows 以外のマシンで。上記と非常によく似たコードを顧客に提供したところ、ビット 8 と 9 の両方が 80 ビットの精度になるように設定されていたので、顧客は満足していました!]