为什么在大型浮子上添加一个小浮子只是放下一个小浮子?

mha*_*190 8 c floating-point

说我有:

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位

Chr*_*ath 6

32位浮点数只有24位精度.因此,浮点数不能精确地保持b - 它可以通过设置一些指数然后尾数尽可能接近来做到最好.

然后当你考虑b和a的浮点表示,并尝试添加它们时,加法运算会将小数a的尾数向下移动,因为它试图匹配b的指数,直到值(3)从关闭点开始.结束,你留下0.因此,加法运算符最终将浮点零添加到b.

  • 23存储,1隐式,共24. (5认同)