Qreal相等在发布时失败,但在调试时有效(并且强制转换为float也有效)
qreal equality fails in release, but works in debug (and cast to float also works)
在我的代码中,我有大量的相等性检查…
例如:int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsLineItem* x = new QGraphicsLineItem(50, 50, -50, -50);
QGraphicsView view(new QGraphicsScene(-200, -150, 400, 300) );
view.scene()->addItem(x);
view.show();
bool sameLine = true;
QLineF line1 = x->line();
qreal _length = line1.length();
foreach(QGraphicsItem* item, view.scene()->selectedItems())
{
QGraphicsLineItem *item2 = dynamic_cast<QGraphicsLineItem*>(item);
if(item2->line().length() != _length )
sameLine = false;
}
qDebug("same line: %d", sameLine);
}
它似乎有效…在调试。然后在发布版中测试时,它失败了?
假设选择的是单个项目,因此item1
和item2
是相同的,因此无论精度如何,上述长度都应该相等....
在调试中,我没有看到这个失败…但是在发行版中,它总是失败!
上述函数(length()
)返回一个qreal
我看到的唯一的变通方法是
-实现我自己的相等性检查,这限制了精度,或
-将qreal
的值强制转换为float
。
但这是不合逻辑的(而且要做很多工作,我必须检查很多潜在的地方)。
谁能解释一下为什么会发生这种情况,以及如何最好地解决这个问题?
如果您已经使用Qt
,则应该将浮点值与qFuzzyCompare
进行比较。永远不要用==
来比较两个浮点变量
相关文章:
- 欧拉项目#8答案是大以获得有效答案
- 调整大小后指向元素值的指针unordered_map有效?
- 为什么是0;C++中的有效语句
- 最高有效数字侧的第N位
- GCC对可能有效的代码抛出init list生存期警告
- 有效地使用std::unordered_map来插入或增加键的值
- c++中O(n^(1/3))中一个数的除数的有效计数
- 使用无符号字符数组有效存储内存
- 自定义先决条件对移动分配运算符有效吗
- System.InvalidCastException - SQL to C++ - safe_cast<float>
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 为什么这种直接初始化有效?(C++17)
- 如何有效地将一个大std::字符串的一部分转换为float
- 获取向量<float>中 k 个最大值的 indize 的有效方法
- 将int重新解释为float的最有效的标准兼容方式
- 使用boost multiprecision/mpfr float-字符串不能被解释为有效的整数错误
- 比较float比double更有效吗
- 为什么用“std::chrono”进行时差测量时,与“double”类型相比,用“float”类型给出的有效数字更多
- Qreal相等在发布时失败,但在调试时有效(并且强制转换为float也有效)