有什么区别:
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)
| 归档时间: |
|
| 查看次数: |
3372 次 |
| 最近记录: |