c - C 中不一致的求和

标签 c floating-point floating-point-precision

当我运行以下程序时:

#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

在每种情况下,我都将变量“数量”增加了 1。

  • 在第一个中,总和给出了我的预期。
  • 在第二个中,它令人惊讶地给出了相同的值。
  • 在第三个中,它继续求和。

为什么会这样?

虽然代码看起来不是很有用,但是我只是把有问题的部分写出来了。我实际上想在更大的程序中使用它。

谢谢!

最佳答案

这是格式问题,而不是数字问题。如果将 printf 更改为

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

结果看起来更符合您的预期:

sum = increase = amount = 432.438851000198
sum = increase = amount = 432.438852000198
sum = increase = amount = 432.438853000198

最后的“垃圾”是由于 float 的精度有限。

关于c - C 中不一致的求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10693777/

相关文章:

lua - 如果 lua number 是 double,=/<=/>= 操作总是正确的吗?

c++ - boost erf() 中的 L(长)后缀 : when is needed and when not?

c++ - cout 能以某种方式改变变量吗?

c - 在 C 中显示从 0.000000001 到 0.999999999 的数字

c - 任何了解网络并将其用于编程的快速指南?

c - 如何在来自 AVS 的 http2 连接上接收超过 65535 字节的数据?

c - GCC 编译时浮点优化

c++ - OpenCV CvMat 到 Mat 和指针

c - 我不明白为什么我不能像这样在末尾添加节点

c - 使用原型(prototype)+定义而不是仅仅使用定义可以加快程序速度吗?