浮点和双常数比较

时间:2015-04-07 04:01:11

标签: c++ double equals-operator

来自http://www.cprogramming.com/tips/tip/difference-between-float-and-double

  

在c ++中,默认情况下,4.12之类的任何值都被视为double。   比较浮动和双打可能是一个棘手的业务,因为   精度差异导致微小错误。例如:

float a = 4.12;

if(a == 4.12)
{
    cout << "hello";
}
else
{
    cout << "bye";
}
  

这将显示输出为“bye 4.12”

     

为什么?

     

因为默认情况下4.12是双精度型(例如if语句或   在我们的变量的赋值中),但将它存储在浮点数中它会丢失   一些精度,所以比较一个double和一个浮点数   导致数字精度的微观变化 - 记住   浮动和双打并不准确。

     

这里有两个教训:一个是浮点数不应该在大多数时间直接比较,另一个是硬编码浮点数的默认大小和类型是双倍。

事情是'你不应该比较浮点变量和双常数'。

所以我的问题是比较浮点变量和浮点常数后跟'f'是否可以?

像这样。

if(a == 4.12f)

1 个答案:

答案 0 :(得分:1)

  

比较float变量和float常量后跟'f'是否正确?

它仍然很危险。与float / double示例相比,a的每个可能值都可能失败,实际上a的值为a == 4.12f true { {1}},但根据您设置a的方式,即使您预期它也可能与4.12f不匹配。例如:

#include <iostream>
#include <iomanip>

int main()
{
    float f = 4.14;
    f -= 0.01;
    f -= 0.01;
    std::cout << std::boolalpha << (f == 4.12f) << '\n';
}

ideone.com here上输出:

false

标准保证在某些情况下会使用最接近的表示形式,因此如果您直接指定float a = 4.12f;,那么之后a == 4.12f必然是true,并且§26.5.1.4保证如果您流出a并将文本流回到另一个float,那么他们将在之后比较等于。

无论如何,如果您认为必须依赖此类内容,请查看标准/文档以了解您正在考虑的具体用法。