c – qFuzzyCompare如何在Qt中工作

有什么区别:
if( a == b )

if( qFuzzyCompare(a,b) )

假设变量a和b是:

a = 1234.5678
b = 1234.5678

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

解决方法

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

当Qt5.6.0附带的qFuzzyCompare()的源代码分别用于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)));
}

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...