双重比较的C ++非常奇怪的行为[关闭]

Posted

技术标签:

【中文标题】双重比较的C ++非常奇怪的行为[关闭]【英文标题】:C++ very weird behavior of double comparison [closed] 【发布时间】:2018-06-27 00:11:32 【问题描述】:

简单的双值比较不起作用..

如截图所示,

double mag = 0.109981
double radius = 0.002

因此,

if(mag > radius) 
    // it's always false?

显然应该是正确的,但事实并非如此。 0.109981怎么不大于0.002?

我在这里做错了什么?它给出了架构警告,但我仍然不明白这里发生了什么......

double mag = dVec.magnitude();
double radius = TOOL_TIP_RADIUS;
double diff = mag - radius;
cout << "mag: " << mag << endl << "radius: " << radius << endl << "diff: " << diff << endl << "mag > radius : " << (mag > radius) << endl;
if (mag > radius) 
    // no collision
    fve == (int) OUTSIDE;

【问题讨论】:

您说比较不起作用,但没有解释您如何确定它不起作用。你说它“显然应该是真的,但事实并非如此”,但不要说为什么你认为它不是。 编译器优化了fve == (int) OUTSIDE;,因为它什么都不做。 无论您在调试器中看到什么,您的程序都能正常工作吗?如果是这样,那么您很可能正在调试优化的构建,其中代码已被移动、删除等。 @DavidSchwartz 不是 0.109981 总是大于 0.002 吗?怎么不是? mag &gt; radius : 1,可以清楚的看到mag更大(否则显示为0) 【参考方案1】:

如果你假设这条线:

fve == (int) OUTSIDE;

什么都不做,因为fve 没有设置为OUTSIDE,这是因为你没有设置 fveOUTSIDE

您正在比较 fveOUTSIDE 是否相等,然后丢弃结果。

我怀疑你应该写过(一个=):

fve = (int) OUTSIDE;

【讨论】:

谢谢! '==' 是我的错字,这导致代码被优化以跳过那个 'if' 语句。非常感谢! 始终启用所有警告。编译器会在这些情况下通知您

以上是关于双重比较的C ++非常奇怪的行为[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

比较未定义和错误的非常奇怪的行为

C ++中反向迭代器的非常奇怪的行为

Object.assign 的奇怪行为

C++ ostringstream 奇怪的行为

C++ string.length() 奇怪的行为

应用程序再次激活时 CLLocationManager 的奇怪行为