昨天我在Stack Overflow上询问了一个问题,关于为什么我在浮点运算中失去了精度。我得到了一个答案,说这是由于中间结果被保存在x87寄存器中导致的。这很有帮助,但其中一些细节仍然让我困惑。这里是我在上一个问题中提出的程序的变体,我正在使用VC++ 2010 Express调试模式。
int main()
{
double x = 1.8939201459282359e-308; /* subnormal number */
double tiny = 4.9406564584124654e-324; /* smallest IEEE double */
double scale = 1.6;
double temp = scale*tiny;
printf("%23.16e\n", x + temp);
printf("%23.16e\n", x + scale*tiny);
}
这将输出:
1.8939201459282369e-308
1.8939201459282364e-308
第一个值符合IEEE标准。将变量
scale
的值设为2.0可以使两个计算得到正确的值。我明白第一次计算中的temp
是一个次正常值���因此失去了精度。我也知道scale*tiny
的值保存在具有更大指数范围的x87寄存器中,因此该值比temp
具有更高的精度。但我不明白的是,当将这个值添加到x
时,我们从较低精度的值中得到了正确的答案。如果较低精度的值可以给出正确的答案,那么较高精度的值也应该给出正确的答案,对吗?这与“双舍入”有关吗?谢谢您提前帮忙,这对我来说是一个全新的主题,所以我有点困难。