这段小代码让我抓狂:
#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 系统上启用双精度舍入,而不是如何在其他系统上使用扩展精度。这在 MacO 或 Windows 上可行吗?如何 ?