【问题标题】:C++ very weird behavior of double comparison [closed]双重比较的C ++非常奇怪的行为[关闭]
【发布时间】: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)

标签: c++ c visual-studio double


【解决方案1】:

如果你假设这条线:

fve == (int) OUTSIDE;

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

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

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

fve = (int) OUTSIDE;

【讨论】:

  • 谢谢! '==' 是我的错字,这导致代码被优化以跳过那个 'if' 语句。非常感谢!
  • 始终启用所有警告。编译器会在这些情况下通知您
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 2014-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多