昨天我问了一个问题,为什么我在浮点运算中失去了准确性。由于中间结果保存在 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
我们从较低精度值中得到正确答案时。当然,如果较低的精度值可以给出正确的答案,那么较高的精度值也应该给出正确的答案吗?这与“双舍入”有关吗?
在此先感谢,这对我来说是一个全新的主题,所以我有点挣扎。