两个浮点加法不改变结果

Two floating point addition is not changing result

#include<stdio.h>

int main()
{

    int loopCounter = 0;    
    float data1,data2;

    data1 = 2000.0f;
    data2 = 0.0001f;

    while(1)
    {               
      data1 = data1 + data2;
      printf("Loop Counter %d , Data %f\n",loopCounter,data1);
      loopCounter++;
    }
    return 0;
}

我 运行 这段代码在 Linux 机器上使用 GCC 编译器,但是如果添加的 2 个浮点数达到值 2048.0 它不再改变。

有人知道为什么会这样吗?

Anyone has idea why this is happening?

由于浮点精度。

阅读Ranges of floating point datatype in C?

注意:

 2000.0001

已经超过 float 可以存储的限制(IEEE-754 单精度约 7 位数字)。


您的情况是精度有限,这导致了您报告的 "halting" 问题。换句话说,在某个时间点之后,添加没有任何实际效果(反映给用户)。

我的意思是新总和 与之前的总和非常接近,它们的浮点表示相同,导致 data1 存储相同的值.

你的机器中,这个值为2048,所有剩余的小δ加法不影响data1的浮点表示。

对于任何浮点值,结合一个(小得多的)相加增量,有一个值,从该值中相加增量得到的值与前一个值相差 "similar",即浮点数的表示是相同的。

您的代码实际上是为找到该值量身定制的。

因此,虽然最初将 delta 添加到 2000 和一些后续值会导致明显的变化,但您的代码迟早会(实际上很快)达到特殊值。我假设你的情况是 2048.
2048.02048.0001 在 float 中没有不同的表示。因此添加对变量没有影响。