我正在用 C++ 编写代码,并将 PI 定义为:
const double MathConstants::PI = atan(1.0)*4.0;
在我的代码中,我设置了一个浮点变量:
float result = (float) (-MathConstants::PI / 2.0);
当我在内存中打印结果值时,我得到 DB 0F C9 BF 小尾数法。转换为大端字节序,即 BF C9 0F DB。
根据http://babbage.cs.qc.cuny.edu/IEEE-754.old/Decimal.html这相当于-1.5707964。
我不明白的是为什么我得到-1.5707964而不是-1.5707963。 -1.5707963 是我期望的结果,因为 -PI/2 是 -1.5707963267948966。
有人可以在这里启发我吗?
最佳答案
四舍五入是二进制的,而不是十进制的。当您查看十进制结果时,它似乎是错误的,因为您希望它四舍五入最后的十进制数字,但这不是它所做的。它正在四舍五入最终的二进制位。
我在您提供的链接中输入了 1.57079632679489661923132169163975 作为 PI/2 的常量,它给出了正确的输出 1.5707964。
比较 64 位表示与 32 位表示:
1 .1001001000011111101101010100010001000010110100011000
1 .10010010000111111011011
被截断的部分从 1 开始,因此适当的舍入需要将 32 位结果向上提升。
关于c++ - 浮点舍入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9811644/