【问题标题】:Weird bug with floats in if-statementif 语句中带有浮点数的奇怪错误
【发布时间】:2013-05-20 23:07:12
【问题描述】:

所以在我的 C++ 代码中,我有以下代码行用于调试目的:

if(float1 != float2)
{
    std::cout<<float1<<" "<<float2<<std::endl;
}

发生的事情是程序正在进入 if 语句......但是当我打印出两个浮点值时,它们是相同的。但如果它们相同,那么它应该完全绕过这个 if 语句。所以我真的很困惑为什么会这样。

【问题讨论】:

  • 重复了这么多问题,所有问题都以这个为主要答案:docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
  • 他们不一样。
  • @chris:Goldberg 的论文可能有点矫枉过正。关键是恰好以相同方式显示的浮点值不一定相等。修改输出语句以显示更精确,您会发现它们是不同的。浮点运算是不精确的。
  • @KeithThompson,是的,很多,但它几乎是提供信息的链接。当然,在提问之前搜索相关问题会给出一些很好的现场解释。
  • @chris 只提供晦涩难懂的文章作为简单问题的答案,这就是迷信是如何产生的。

标签: c++ if-statement printing floating-point cout


【解决方案1】:

floats 可能只是具有非常相似的值。默认情况下,I/O 库将截断浮点值的输出。您可以通过调用std::coutprecision 成员函数来确保获得完整的精度:

if(float1 != float2)
{
    std::cout.precision(9);
    std::cout<<float1<<" "<<float2<<std::endl;
}

现在您应该看到不同之处了。值 9 是 IEEE 754 32 位浮点数可表示的 base-10 位数(请参阅下面的 @EricPostpischil 评论)。

【讨论】:

  • digits10 是最大位数,这样可以将具有这么多位数的十进制数字转换为浮点类型并再次返回而无需更改。这不是该类型的完整精度——可能有两个不同的浮点值,但在用 digits10 数字转换时会产生相同的数字。您需要保证可观察到的差异的值是 IEEE 754 标准所称的 Pmin(binary32),即 9。我没有看到提供此值的 C 或 C++ 功能。
  • @EricPostpischil 谢谢。我不完全确定我写的内容是否正确。
【解决方案2】:

浮点值通常以二进制格式存储在计算机内存中。同时,您通过cout 打印的值以十进制格式表示。从二进制浮点表示到十进制表示的转换可能是有损的,具体取决于您的转换设置。这意味着您打印的内容不一定与实际存储在内存中的内容完全相同。这解释了为什么直接比较 float1float2 可能会说它们不同,而十进制打印输出可能看起来相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 2022-07-07
    相关资源
    最近更新 更多