6

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

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

上面的断言语句不能通过。很奇怪。
我的环境是mac os ml。GCC 4.2.1

4

3 回答 3

8

a 的小数部分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
于 2012-11-26T00:21:08.223 回答
6

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

于 2012-11-26T00:16:51.417 回答
1

本网站所示,a 和 b 都将表示为

0 10011100 10001001100010001010011

in the IEEE standard for floats, where the first bit is the sign, the next 8 are the exponent, and the remaining 23 the mantissa. There's just not enough space in those 23 bits to represent the difference, because the exponent is so large.

于 2012-11-26T00:29:03.320 回答