Qreal相等在发布时失败,但在调试时有效(并且强制转换为float也有效)

qreal equality fails in release, but works in debug (and cast to float also works)

本文关键字:有效 float 转换 布时 失败 调试 Qreal      更新时间:2023-10-16

在我的代码中,我有大量的相等性检查…

例如:

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);
}

它似乎有效…在调试。然后在发布版中测试时,它失败了?

假设选择的是单个项目,因此item1item2是相同的,因此无论精度如何,上述长度都应该相等....

在调试中,我没有看到这个失败…但是在发行版中,它总是失败!

上述函数(length())返回一个qreal

我看到的唯一的变通方法是
-实现我自己的相等性检查,这限制了精度,或
-将qreal的值强制转换为float
但这是不合逻辑的(而且要做很多工作,我必须检查很多潜在的地方)。

谁能解释一下为什么会发生这种情况,以及如何最好地解决这个问题?

如果您已经使用Qt,则应该将浮点值与qFuzzyCompare进行比较。永远不要用==来比较两个浮点变量