【问题标题】:If statement - incorrect evaluation [duplicate]If语句 - 不正确的评估[重复]
【发布时间】:2012-10-29 19:01:36
【问题描述】:

可能重复:
How should I do floating point comparison?

这是一段sn-p代码,我不知道它有什么问题。

if 语句不正确地评估数字并转到“else”。

double m,k;

m = (y3-y1)/(x3-x1);
k = m*(-x1)+y1;

cout <<"\n\n"<< m <<"  "<< k << "\n";
cout <<"\n\n"<< ((-a)/b) <<"  "<< c/b << "\n";

if(m==((-a)/b) && k==c/b)
 {
  cout << "\nTaisne sakrīt ar kādu no trīsstūra malām!" << endl;
  goto beigas;
 }
  else
   cout << "\n\n WRONG \n\n";

用户输入值 x1,y1,x3,y3,a,b,c - 都是 double

似乎只有“m”才能正常工作。奇怪的是,当我尝试以下操作时,if 语句在相同的值下为真:

if(m==((-a)/b) && k<c/b)

这里是一个截图来得到整个问题:

代码在用户输入所有值后开始。

谢谢,任何帮助将不胜感激!

【问题讨论】:

  • 浮点运算不精确。
  • 另外,请避免 goto 语句,GOTO 是邪恶的!
  • 如果你使用goto statement会发生什么
  • @VictorHugo:不小心使用 goto 语句会导致代码难以理解和维护,因为与使用更规则结构的代码相比,控制流对人类来说不太明显,例如带有单一入口点和单一出口,或至少明确定义的共同点出口。这会增加软件开发和维护的成本并增加错误。

标签: c++ if-statement evaluation


【解决方案1】:

当您想比较两个浮点时,请使用类似的阈值:

double m = a/b;

if (abs(m - (a/b)) < 0.0001)
{
    // execute code where m == a/b here
}

所以基本上是比较float/double减去它们并确保结果小于某个阈值。

【讨论】:

  • 0.0001 这样的恒定阈值可能是也可能不是最好的方法。确定两个浮点值是否足够接近以被视为“相等”可能很困难;它可能取决于值的计算方式以及它们的含义。
  • 这种方法减少了误报(不正确地拒绝相等),但增加了误报(不正确地接受相等)。不知道应用程序的要求,你无法知道这是否是正确的解决方案。
  • 谢谢,问题解决了。尽管我还必须对其他地方的代码进行一些更改才能使整个程序正常工作。此外,计算工作的错误百分比有点小,比如说,0.01%,但在我的情况下这是可以承受的。现在我知道了在处理浮点数时你必须有不同的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多