浮点舍入

Floating point rounding

本文关键字:舍入      更新时间:2023-10-16

我正在用C++编写代码,并将PI定义为:

const double MathConstants::PI = atan(1.0)*4.0;

否则,在我的代码中,我设置了一个浮点变量:

float result = (float) (-MathConstants::PI / 2.0);

当我在内存中打印结果的值时,我得到DB 0F C9 BF little endian。转换为big-endian,即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位的结果向上凸起。