qFuzzyCompare如何在Qt中工作

时间:2016-05-08 22:03:26

标签: c++ qt

有什么区别:

if( a == b )

if( qFuzzyCompare(a, b) )

假设变量a和b是:

a = 1234.5678
b = 1234.5678

注意:我问,因为我在比较Qt中的双打时遇到问题,我想了解qFuzzyCompare的工作原理。

1 个答案:

答案 0 :(得分:8)

qFuzzyCompare()的{​​{3}}并没有真正解释为什么要使用它,但通常比较浮点值被认为是一种不好的做法,因为可能会发现两个看似相同的浮点变量因舍入错误。您可以阅读有关浮点变量official documentation的这个和其他陷阱的更多信息。

在查看qFuzzyCompare()的源代码时,分别为Qt5.6.0附带的double和float(按住CTRL并单击该函数以在QtCreator中看到此内容),可以推断出它试图减少不准确的可能性妨碍平等测试

Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(double p1, double p2) Q_REQUIRED_RESULT Q_DECL_UNUSED;
Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(double p1, double p2)
{
    return (qAbs(p1 - p2) * 1000000000000. <= qMin(qAbs(p1), qAbs(p2)));
}

Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(float p1, float p2) Q_REQUIRED_RESULT Q_DECL_UNUSED;
Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(float p1, float p2)
{
    return (qAbs(p1 - p2) * 100000.f <= qMin(qAbs(p1), qAbs(p2)));
}