#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;
}
我正在使用GCC编译器在Linux机器上运行此代码,但如果2 float的添加达到值2048.0
,则它不再更改。
有谁知道为什么会这样?
答案 0 :(得分:4)
对于任何浮点值,结合(更多)较小的添加增量,有一个值,从中添加增量值得到的结果是类似的&#34;类似的&#34;到前一个,float中的表示是相同的。
您的代码实际上是为了找到该值而量身定制的。
因此,在首次将delta添加到2000并且一些后续值导致可见更改时,您的代码迟早(实际上很快)会达到特殊值。我假设你的情况是2048年
2048.0
和2048.0001
在浮点数中没有不同的表示形式。因此,添加对变量没有影响。
答案 1 :(得分:2)
任何人都知道为什么会这样?
由于浮点精度。
阅读Ranges of floating point datatype in C?
请注意:
2000.0001
已超过 float
可以存储的限制(IEEE-754单精度约为7位)。
在您的情况下会发生的情况是精度有限,这会导致您报告的“暂停”问题。换句话说,在某个点之后,adition没有任何实际效果(反映给用户)。
我的意思是新的总和如此接近到前一个总和,它们的浮点表示是相同的,导致data1
存储相同的值。
在你的机器中,这个值是2048,所有其余的加上小的δ都不会影响data1
的浮动表示。