两个浮点加法不改变结果
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.0
和 2048.0001
在 float 中没有不同的表示。因此添加对变量没有影响。
#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.0
和 2048.0001
在 float 中没有不同的表示。因此添加对变量没有影响。