【问题标题】:Double inequality while comparying three floating point numbers [duplicate]比较三个浮点数时出现双重不等式[重复]
【发布时间】:2015-12-21 05:01:29
【问题描述】:

有人可以告诉我为什么以下不起作用吗?(我的意思是没有输出)

if(0.0001<0.001<0.01)   
    cout<<"hi\n"<<endl;
output:    (blank)

虽然以下工作:

if(0.0001<0.001 && 0.001<0.01)  
    cout<<"hi\n"<<endl;
  output:hi

【问题讨论】:

  • 解释一下你认为if(0.0001&lt;0.001&lt;0.01) 做了什么...
  • 0.001 位于(0.0001,0.01)。期间。
  • 对否决票的解释?
  • 最初的问题没有解释你所说的“作品”是什么意思,你期望或想要发生什么。您也没有解释“为什么”的意思。你的意思是你不明白 C++ 在做什么?您的意思是您确实了解 C++ 在做什么,但您不了解 C++ 以这种方式工作的动机?等
  • 通过“工作”,我的意思是我在第二种情况下得到了输出,而在第一种情况下没有输出(这显然是书面的)。我想问题很清楚(如果不清楚,我没有得到正确的答案。下面)。您可以要求澄清,而不是投反对票。

标签: c++ floating-point


【解决方案1】:

因为在 C++ 中没有神奇的 n 元 &lt; 运算符。

0.0001 < 0.001 < 0.01 

被解析为(因为&lt; 是左关联的)

(0.0001 < 0.001) < 0.01

0.0001 &lt; 0.001 返回一个bool 类型的值,其值为true。现在你有

true < 0.01

但根据标准,true boolean 在转换为整数类型时的值为 1,因此您有

1 < 0.01

这是错误的。

【讨论】:

  • 我刚刚发现true&lt;0.01 在 C++ 中有效,但在 JAVA 中无效。你能告诉我为什么吗?它说它无法将 bool 与 float/double 进行比较。
【解决方案2】:

如果你的意思只是你不明白0.0001&lt;0.001&lt;0.01 的含义或它为什么不符合你的预期:C++ 只定义了比较运算符的二进制版本。所以0.0001 &lt; 0.001 &lt; 0.01 不是所有三个值的单一比较;这是两个值的比较,然后是第三个值与另一个比较结果的另一个比较。 IE。 0.0001 &lt; 0.001 &lt; 0.01 等同于(0.0001 &lt; 0.001) &lt; 0.01 等同于true &lt; 0.01 等同于1 &lt; 0.01

如果你的意思是为什么 C++ 没有定义运算符来按照你想要的方式工作,那是因为没有人看到让 C++ 以这种方式工作的足够价值。

【讨论】:

    【解决方案3】:

    当你使用像

    这样的条件时
    (0.0001<0.001<0.01)
    

    它将首先检查 0.0001

    ( 1< 0.01 )
    

    这是假的,所以返回 0 这就是不打印的原因。

    【讨论】:

    • 这不依赖于编译器。 C++ 指定关联性,因此a &lt; b &lt; c 将始终评估为(a &lt; b) &lt; c
    猜你喜欢
    • 2014-01-08
    • 2016-05-10
    • 2013-03-12
    • 2011-10-24
    • 1970-01-01
    • 2015-10-22
    • 2023-04-05
    相关资源
    最近更新 更多