为什么我的浮点值看起来不等于自身?

时间:2018-12-30 04:08:30

标签: c++ floating-point

#include<iostream.h>
using namespace std;
int main()
{
      float x=1.1;
      if(x==1.1)
         cout<<"yes";
      else
         cout<<"no";
      return 0;
}

我为x分配了值1.1,并且x的检查值是否为1.1?

2 个答案:

答案 0 :(得分:4)

您已经进入了几乎所有编程语言的有趣领域。浮点值是一件棘手的事情,很少建议对其进行相等性测试。基本问题是,现代计算机上的浮点值表示为二进制十进制数,其精度位数有限。

为使这一点更容易理解,让我们使用以10为基数的小数,并使用无法使用它们精确表示的数字。拿1/3。如果将其表示为以10为基数的小数,则得到以下信息:

0.̅3(如果显示不正确,则在三个上方都有一个条)。基本上,它永远持续下去,没有有限的位数可以完美精确地将1/3表示为以10为基数的十进制。因此,如果您只有这么多的数字,则将其切碎并近似:

0.333333

实际上是333333/1000000,实际上接近1/3,但不完全相同。

C ++有一些不同的浮点类型。这些类型通常(取决于要为其编译程序的平台)具有不同数量的有效数字。默认情况下,浮点常量的类型为double,通常比float的位数多(并且永远不会少)。再次以10为底的示例,由于您将值存储在float中,因此您将执行以下操作:

0.333333 == 0.3333333333333333333

那当然是错误的。

如果您以这种方式编写代码:

#include <iostream>
using namespace std;
int main()
{
      float x = 1.1f;
      if(x == 1.1f)
         cout<<"yes";
      else
         cout<<"no";
      return 0;
}

您可能会得到预期的结果。将f放在裸浮点值(也就是浮点文字)的末尾会告诉C ++,它的类型为float

这当然非常令人着迷,还有很多东西可以进入。如果您想了解更多有关如何真正表示浮点数的信息,可以使用Wikipedia page on IEEE 754 floating point representation,这是当今大多数现代处理器表示浮点数的方式。

从实际的角度来看,您应该很少(如果有的话)比较浮点数是否相等。通常,这样做的愿望表明程序中存在某种设计缺陷。如果真的需要,那么可以使用“ε”比较。基本上,测试一下您的数字是否“足够接近”,尽管确定在任何给定情况下意味着什么并不一定是一项琐碎的任务,这就是为什么如果您需要比较它们是否完全相等时通常代表设计缺陷的原因。但是,在您的情况下,可能看起来像这样:

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
      float x=1.1;
      if (fabs(x - 1.1) < 0.000001)
         cout<<"yes";
      else
         cout<<"no";
      return 0;
}

答案 1 :(得分:3)

比较失败的原因是您正在将double值与float变量进行比较。

double值分配给float变量时,某些编译器将发出警告。

要获得所需的输出,您可以尝试以下操作:

double x = 1.1;
if (x == 1.1)

或者这个:

float x = 1.1f;
if (x == 1.1f)