使用std :: equal和相等运算符进行比较

时间:2014-11-30 03:45:50

标签: c++ floating-point comparison equality

在下面的代码中,我的印象是所有3"平等"检查是等价的,但最后一个似乎返回与另一个不同的结果2 - 为什么会这样?

#include <cstdio>
#include <vector>
#include <algorithm>

int main()
{
   {
      std::vector<double> d0 { 0.0 , 1.0, 2.0};
      std::vector<double> d1 { 1.0 , 2.0, 3.0};

      d0[0] += double(1);
      d0[1] += double(1);
      d0[2] += double(1);

      if (std::equal(std::begin(d0),std::end(d0),std::begin(d1)))
         printf("equal\n");
      else
         printf("not equal\n");

      if (d0 == d1)
         printf("equal\n");
      else
         printf("not equal\n");

   }

   {
      double d0[] { 0.0 , 1.0, 2.0};
      double d1[] { 1.0 , 2.0, 3.0};

      d0[0] += double(1);
      d0[1] += double(1);
      d0[2] += double(1);

      if (std::equal(d0,d0 + sizeof(d0),d1))
         printf("equal\n");
      else
         printf("not equal\n");
   }

   return 0;
}

1 个答案:

答案 0 :(得分:1)

最后一个不能比较相等,因为这个表达式d0 + sizeof(d0)没有达到预期的效果。应用于数组的sizeof计算数组的大小(以字节为单位),而不是数组中的元素数。因此,您不会在d0中的最后一个元素之后创建一个迭代器。

使用其中一个

if (std::equal(d0, d0 + sizeof(do0)/sizeof(d0[0]), d1))

#include <type_traits>

...

if (std::equal(d0, d0 + std::extent<decltype(d0)>::value, d1))

#include <iterator>

...

if (std::equal(std::begin(d0), std::end(d0), d1))