C++ qFuzzyCompare在Qt中是如何工作的

C++ qFuzzyCompare在Qt中是如何工作的,c++,qt,C++,Qt,以下两者之间的区别是什么: if( a == b ) 及 假设变量a和b为: a = 1234.5678 b = 1234.5678 注意:我问这个问题是因为我在比较Qt中的双精度时遇到了困难,我想了解qFuzzyCompare是如何工作的。forqFuzzyCompare()并没有真正解释为什么要使用它,但一般来说,比较浮点值被认为是一种不好的做法,因为两个看似相同的浮点变量可能会因舍入错误而不同。您可以阅读更多关于这一点以及浮点变量的其他问题 当查看Qt5.6.0附带的分别用于doubl

以下两者之间的区别是什么:

if( a == b )

假设变量a和b为:

a = 1234.5678
b = 1234.5678
注意:我问这个问题是因为我在比较Qt中的双精度时遇到了困难,我想了解
qFuzzyCompare
是如何工作的。

for
qFuzzyCompare()
并没有真正解释为什么要使用它,但一般来说,比较浮点值被认为是一种不好的做法,因为两个看似相同的浮点变量可能会因舍入错误而不同。您可以阅读更多关于这一点以及浮点变量的其他问题

当查看
Qt5.6.0
附带的分别用于double和float的
qFuzzyCompare()
源代码时(按住CTRL键并单击函数可在
QtCreator
中查看此项),可以推断它试图降低不准确度妨碍相等性测试的可能性:

Q_DECL_CONSTEXPR静态内联bool qFuzzyCompare(双p1,双p2)Q_REQUIRED_RESULT Q_DECL_UNUSED;
Q_DECL_CONSTEXPR静态内联bool qFuzzyCompare(双p1,双p2)
{

返回(qAbs(p1-p2)*10000000000。这不是一个坏的做法。将浮点变量与
=
进行比较是完全错误的。此函数对epsilon值进行假设。使用Qt epsilon和不手动定义它有什么警告?警告我不知道,但使用它意味着您将使用与Qt其余部分相同的epsilon这可能会使您避免在交错计算中使用不同的ε而产生的细微错误。
a = 1234.5678
b = 1234.5678
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)));
}