我是c的新手。所以当我写一个小游戏演示时,我面临一个非常奇怪的问题。
void testC()
{
float a = 825300160;
float b = a + 0.1;
assert(a != b);
}
上述断言声明无法通过。很奇怪。
我的环境是mac os ml。 gcc 4.2.1
答案 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位中没有足够的空间来表示差异,因为指数太大了。