双重比较的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 > radius : 1
,可以清楚的看到mag
更大(否则显示为0)
【参考方案1】:
如果你假设这条线:
fve == (int) OUTSIDE;
什么都不做,因为fve
没有设置为OUTSIDE
,这是因为你没有设置 fve
为OUTSIDE
。
您正在比较 fve
和 OUTSIDE
是否相等,然后丢弃结果。
我怀疑你应该写过(一个=
):
fve = (int) OUTSIDE;
【讨论】:
谢谢! '==' 是我的错字,这导致代码被优化以跳过那个 'if' 语句。非常感谢! 始终启用所有警告。编译器会在这些情况下通知您以上是关于双重比较的C ++非常奇怪的行为[关闭]的主要内容,如果未能解决你的问题,请参考以下文章