【发布时间】:2013-03-05 06:14:50
【问题描述】:
昨天我向question 询问了为什么我在浮点运算中失去了准确性。由于中间结果保存在 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 时,我们会从较低的精度值中得到正确的答案。当然,如果较低的精度值可以给出正确的答案,那么较高的精度值也应该给出正确的答案吗?这与“双舍入”有关吗?
提前谢谢,这对我来说是一个全新的主题,所以我有点挣扎。
【问题讨论】:
-
以下可能是正确的,但对我来说并不明显:当然,如果较低的精度值可以给出正确的答案,那么较高的精度值也应该给出正确的答案?
-
如果我是你,我会在这样的计算中使用
long double... -
我们如何知道低精度数的最后一位没有随机值?总是有 10% 的机会达到预期目标。
-
@RondogiannisAristophanes 我的愿望是了解正在发生的事情。
-
@BoPersson 你的评论让我很困惑,没有随机数字,一切都是确定的。加上 IEEE-754 浮点是二进制而不是十进制。
标签: c floating-point floating-accuracy ieee-754 floating-point-precision