为什么下面的代码表现得像在 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/