我是c的新手。所以当我写一个小游戏演示时,我遇到了一个非常奇怪的问题。
void testC()
{
float a = 825300160;
float b = a + 0.1;
assert(a != b);
}
上面的断言语句不能通过。很奇怪。
我的环境是mac os ml。GCC 4.2.1
我是c的新手。所以当我写一个小游戏演示时,我遇到了一个非常奇怪的问题。
void testC()
{
float a = 825300160;
float b = a + 0.1;
assert(a != b);
}
上面的断言语句不能通过。很奇怪。
我的环境是mac os ml。GCC 4.2.1
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
浮点类型的精度不够。如果你真的需要区分 0.1 和 825300160 这样大的数字的加法,请使用 double。
如本网站所示,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.