说我有:
float a = 3 // (gdb) p/f a = 3
float b = 299792458 // (gdb) p/f b = 299792448
Run Code Online (Sandbox Code Playgroud)
然后
float sum = a + b // (gdb) p/f sum = 299792448
Run Code Online (Sandbox Code Playgroud)
我认为它与尾数移动有关.有人能解释到底发生了什么吗?32位
32位浮点数只有24位精度.因此,浮点数不能精确地保持b - 它可以通过设置一些指数然后尾数尽可能接近来做到最好.
然后当你考虑b和a的浮点表示,并尝试添加它们时,加法运算会将小数a的尾数向下移动,因为它试图匹配b的指数,直到值(3)从关闭点开始.结束,你留下0.因此,加法运算符最终将浮点零添加到b.