この小さなコードは私を夢中にさせます:
#include <stdio.h>
int main()
{
double x;
const double d=0.1;
x=d ;
for (int i=0; i<30; i++)
{
printf("Cycle %d Value :%.20e \n",i,x);
x=x*(double)11.-(double)10*d; //11*0.1 = 1.1 - 10*0.1 = 1 => 0.1
}
return 0;
}
実際、私はIEEE 754規格の浮動小数点数の内部表現による病理学的ケースを実証しようとしていました. MacOS または Windows マシンでは、最終的な出力行は次のようになります。
サイクル 29 値 :1.28084153156127500000e+13
しかし、Linux (Scientific Linux 5.4) では、コードは問題なく実行されます。読んで、次のことがわかりました。
FreeBSD、NetBSD、OpenBSD などの BSD システムでは、ハードウェアの倍精度丸めモードがデフォルトであり、ネイティブの倍精度プラットフォームとの最大の互換性を提供します。x86 GNU/Linux システムでは、デフォルトのモードは拡張精度です (精度を高めることを目的としています)。
同じページのGCC INTROでは、Linux システムで倍精度丸めを有効にする方法が説明されていましたが、他のシステムで拡張精度を使用する方法については説明されていませんでした。MacOsまたはWindowsでそれは可能ですか? そしてどうやって ?