【问题标题】:Floating point rounding浮点舍入
【发布时间】:2012-03-21 19:37:22
【问题描述】:

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

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

我在代码中的其他地方设置了一个浮点变量:

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

当我在内存中打印结果值时,我得到 DB 0F C9 BF little 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。

有人可以在这里启发我吗?

【问题讨论】:

  • 别忘了浮点数通常是二进制的……不是十进制的。
  • 我们必须检查多少次浮点值固有的不准确性?这似乎已经在 StackOverflow 上被讨论死了。
  • @dreamlax,只要人们有 10 根手指,我们就会继续收到这些问题。至少这个与大多数其他的有点不同。
  • 您决定使用 pi/2 的浮点表示。现在你有 1.5707964 个问题。

标签: c++ floating-point double


【解决方案1】:

四舍五入是二进制,而不是十进制。当您以十进制查看结果时,它似乎是错误的,因为您希望它舍入最后的十进制数字,但这不是它正在做的事情。它正在舍入最后的二进制位。

我在您提供的链接中输入了 1.57079632679489661923132169163975 作为 PI/2 的常量,它给出了正确的输出 1.5707964。

比较 64 位表示和 32 位表示:

1 .1001001000011111101101010100010001000010110100011000
1 .10010010000111111011011

被截断的部分从 1 开始,因此适当的舍入需要将 32 位结果向上提升。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 2020-06-09
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    相关资源
    最近更新 更多