在这种情况下,为什么QCOMPARE不返回True?

时间:2016-06-10 07:15:46

标签: c++ qt eigen

我正在为尚未实现的功能编写测试。在下面的代码中,即使输出和结果向量具有相同的值,QCOMPARE也会返回False。有人能解释一下原因吗?

void EigenValuesTest::EigenValuesTestx2_data()
{
QTest::addColumn<Eigen::MatrixXd>("data");

Eigen::MatrixXd a(2,2);
a<<12,3,4,5;

QTest::newRow("0") << a ;
}

void EigenValuesTest::EigenValuesTestx2()
{
QFETCH(Eigen::MatrixXd, data);

Eigen::EigenSolver<Eigen::MatrixXd> es(data,false);

Eigen::Vector2cd result;
result << std::complex<double>(13.4244,0),std::complex<double>(3.57557,0);

Eigen::Vector2cd output;
output = es.eigenvalues();

QCOMPARE(result,output);

}

2 个答案:

答案 0 :(得分:2)

您需要使用

QCOMPARE(result.isApprox(output), true);

来自Eigen documentation

bool operator== (const MatrixBase< OtherDerived > & other) const
  

如果* this和other的每个系数都完全,则返回true   等于。警告可能使用浮点标量值时   应该使用模糊比较,例如isApprox()另请参阅   isApprox(),operator!=

编辑
您的特征向量不正确。零应为1,即(13.4244, 1.0)(3.57557, 1.0)。此外,它们可能以与参考向量result中指定的顺序不同的顺序出现。你需要考虑更加坚实的考验。

答案 1 :(得分:0)

我想引用文档

  

在比较浮点数和双精度数的情况下,qFuzzyCompare()用于比较。这意味着与0相比可能会失败。对此的一个解决方案是与1进行比较,并将1添加到生成的输出中。

到目前为止,这么好。自动完成,但现在

  

请注意,比较p1或p2为0.0的值将不起作用。对此的解决方案是与大于或等于1.0的值进行比较。

可能会导致问题,因为您的比较值中有零。

此外,如果Q_COMPARE适用于所提供的类型,我无法肯定地说。任何输出都可能有所帮助。

  

如果比较失败,QCOMPARE会尝试输出值的内容,因此从测试日志中可以看出比较失败的原因。