我可以在哪种情况下直接使用C ++中的==来比较两个浮点变量?

时间:2014-09-16 13:30:25

标签: c++

我知道比较两个浮点变量非常棘手。通常,当两个浮点变量的差值低于阈值时,我们认为这两个变量相等。但是,某些情况下,直接使用==是可能的,例如,

int main()
{   

     float angle = 3.123f;
     if(angle == 3.123f)
     {
         std::cout<<"the same"<<std::endl;
     }
     else
     {
         std::cout<<"different"<<std::endl;
     }

     angle = 13;
     if(angle == 13 )
     {
         std::cout<<"the same"<<std::endl;
     }
     else
     {
         std::cout<<"different"<<std::endl;
     }

    return 0;
}

我在VC 2010中编译代码,似乎==在两种情况下都有效。因此,我问的问题是:在哪种情况下我们可以安全地使用==来比较两个变量?

我问这个问题的原因是因为我的项目中有一个功能,如下所示

void fun(int a, int b, float value=180); 

void fun(int a, int b, float value)
{
   if(value == 180)
   {
       // do something
   }
   else
   {
        // do something
   }
}

基本上,在fun函数中,有一个默认的浮点变量作为函数参数。在函数实现中,我们将检查我们是否使用默认设置,如果是,将执行特殊处理。

4 个答案:

答案 0 :(得分:9)

最多2 ^ 24的所有整数都可以表示为float s,所以这里不会有任何麻烦。

不使用浮点等式的主要原因是浮点运算不精确 - (180 / 7) * 7可能或可能不完全等于180.但是,如果它只是作为默认参数传递,你是完全安全的。

如果您特别关注,而不是默认参数,只需输入一个处理默认情况的双参数重载。

答案 1 :(得分:2)

当您想要它的意图时,请使用==:完全相等的比较。通常不适合检查可能具有舍入误差的不精确计算结果的完全相等,但是如果您想将某个(精确)值视为特殊情况,则期望调用者将通过那个(确切的)值为了触发特殊情况,那就OK了。

检查使计算更简单的确切值也是有意义的:例如,如果您正在实现余弦函数,则可以检查参数是否等于(确切地)0并返回(确切地)1 ,跳过更复杂的数学来计算一般情况下的余弦。请注意,在这种情况下,您将返回与更复杂的计算生成的相同的值,因此呼叫者不会看到奇怪的行为,具体取决于他们是否正好通过0或非常接近于0:他们只得到1或非常接近1的东西。

答案 2 :(得分:2)

显然,相等意味着您之前比较的确切值已经分配给变量。让事情变得棘手的不是比较,而是浮动背后的数学。如果指定180 t浮点数并将其与180进行比较,则它将始终为真。同样适用于分配4.15并与4.15进行比较等等。只有在进行计算并且所涉及的值不能用于浮点数的二进制格式无法准确表示时,舍入错误才会起作用。

然而,在你的情况下没有意思,因为你只想区分默认和非默认。你应该为这种情况使用两个函数并重载它们:

void fun(int a, int b)
{
  // do the default-something
}

void fun(int a, int b, float value)
{
  // do the else-something
}

但是,如果您的非默认输入是偶然的180f,则行为会有所不同。

答案 3 :(得分:0)

对于足够小的整数,你应该非常安全。

但是,只要您比较的价值经过任何处理或转化,所有投注都会被取消。

这不是一个好主意。

考虑使用NaN,无穷大或其他东西&#34;更难&#34;。