为什么下面的代码表现得像在 C 中一样?

float x = 2147483647; //2^31
printf("%f\n", x); //Outputs 2147483648

以下是我的思考过程:
2147483647 =   0      1001 1101      1111 1111 1111 1111 1111 111

   (0.11111111111111111111111)base2 = (1-(0.5)^23)base10
=> (1.11111111111111111111111)base2 = (1 + 1-(0.5)^23)base10 = (1.99999988)base10

因此,要将 IEEE 754 表示法转换回十进制: 1.99999988 * 2^30 = 2147483520
所以从技术上讲,C 程序一定打印出了 2147483520,对吧?

最佳答案

要表示的值将是 2147483647。接下来可以用这种方式表示的两个值是 2147483520 和 2147483648。

由于后者更接近于不可表示的“理想的”,它被使用:在浮点数中,值被四舍五入,而不是被截断。

关于c - IEEE 754 : How exactly does it work?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7005862/

10-10 07:27