C语言中的不一致求和

3
当我运行以下程序时:
#include <stdio.h>
#include <math.h>

int main()
{
    double sum, increase;
    long amount, j;

    printf("sum = ");
    scanf("%lf", &sum);
    printf("increase = ");
    scanf("%lf", &increase);
    printf("amount = ");
    scanf("%ld", &amount);

    for (j = 1; j <= amount; j++)
    {
        sum += increase;
    }

    printf("%lf\n", sum);

    return 0;
}

我得到了以下这些值的响应:
MacBook:c benjamin$ ./test
sum = 234.4
increase = 0.000001
amount = 198038851
432.438851
MacBook:c benjamin$ ./test
sum = 234.4
increase = 0.000001
amount = 198038852
432.438851
MacBook:c benjamin$ ./test
sum = 234.4
increase = 0.000001
amount = 198038853
432.438852

在每种情况下,我将变量"amount"增加1。

  • 在第一个例子中,求和得到了我预期的结果。
  • 在第二个例子中,令人惊讶的是,它给出了相同的值。
  • 在第三个例子中,它继续求和。

为什么会发生这种情况?

虽然代码似乎并不是很有用,但我只是写出了有疑问的部分。实际上我想在一个更大的程序中使用它。

谢谢!


你忘记了实际的问题吗? - Michael Lorton
6
浮点数具有有限的精度,当精度不够时,某些数值可能会被舍入成相同的值。 - Corbin
3
《计算机科学家应知道的浮点数算术知识》是一篇介绍浮点数算术的重要性、原理和常见问题的文章。它涵盖了浮点数的二进制表示、舍入误差、最佳实践等方面的内容,并提供了一些可帮助程序员正确处理浮点数的建议。该文章适用于所有需要编写涉及浮点数运算的计算机科学家和工程师。 - epatel
1
我想投票将这个问题关闭为C-使用双精度求和的重复,因为它们几乎相同。唯一的原因是链接的问题中的代码质量非常差,而你的代码至少是可读且简洁的。 :) - Ken White
1个回答

3
这是格式问题,而不是数字问题。如果你把printf改成
printf("%.12lf\n", sum);

结果看起来更符合您的预期:
sum = increase = amount = 432.438851000198
sum = increase = amount = 432.438852000198
sum = increase = amount = 432.438853000198

“末尾的“垃圾”是由于浮点数精度有限造成的。”

这是您在ideone上稍作修改后的程序[链接]。 - Sergey Kalinichenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接