qFuzzyCompare如何在Qt中工作

Kel*_*inS 9 c++ qt

有什么区别:

if( a == b )
Run Code Online (Sandbox Code Playgroud)

if( qFuzzyCompare(a, b) )
Run Code Online (Sandbox Code Playgroud)

假设变量a和b是:

a = 1234.5678
b = 1234.5678
Run Code Online (Sandbox Code Playgroud)

注意:我问,因为我在比较Qt中的双打时遇到了麻烦,我想知道它是如何qFuzzyCompare工作的.

Len*_*and 11

官方文档qFuzzyCompare()并没有真正解释为什么人会利用这一点,但一般比较浮点值被认为是不好的做法,因为两个看似相同的浮点变量,可以发现不同,由于舍入误差.您可以在此处阅读有关浮点变量的更多信息和其他问题.

qFuzzyCompare()分别查看double和float的源代码时Qt5.6.0(保持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)));
}
Run Code Online (Sandbox Code Playgroud)

  • 这不是一个坏习惯*将浮点变量与'=='进行比较是完全错误的 (3认同)
  • @ixSci 这并不是“完全错误”。平等确实有其用处,尽管很少。例如,如果您在某处存储浮点值并想要检查这个确切的浮点值是否返回(例如在序列化/反序列化周期中),“==”是唯一合适的工具。 (3认同)
  • @AlexanderShishenko 需要注意的是,与 Lennart Rolland 的评论相反,这不会让你避免错误:相反,它会因为“我太懒了,无法想出一个合理的值”这种错误而咬你的屁股。您的 epsilon 应采用类似于_工程公差_的方式。此容差取决于您使用的单位(由于它们对数字大小的影响)以及您正在计算的确切变量(因为不同的变量可能有不同的精度要求)。正确的计算可能会有几个 epsilon:一个对应于要比较的每种变量。 (2认同)