当我添加0.1时,浮动不会改变

时间:2012-11-26 00:13:30

标签: c

我是c的新手。所以当我写一个小游戏演示时,我面临一个非常奇怪的问题。

 void testC()
 {
     float a = 825300160;
     float b = a + 0.1;
     assert(a != b);
 }

上述断言声明无法通过。很奇怪。
我的环境是mac os ml。 gcc 4.2.1

3 个答案:

答案 0 :(得分:8)

float的小数部分由23位组成。您需要30位来表示825300160,因此数字中较不重要的部分将被删除。添加.1并没有什么区别 - 您需要为要更改的数字添加大约32

float a = 825300160;
float b = a + 31.5;
assert(a != b); // No change is detected
float c = a + 32;
assert(a != c); // Change is detected

答案 1 :(得分:6)

浮动类型的精度不够。如果你真的需要区分0.1加法和825300160之间的数字,请使用double。

答案 2 :(得分:1)

this site所示,a和b都表示为

0 10011100 10001001100010001010011

在浮点数的IEEE标准中,第一位是符号,接下来的8是指数,剩下的23是尾数。这些23位中没有足够的空间来表示差异,因为指数太大了。