qreal equality 在发布时失败,但在调试中有效(并且转换为 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);
}

它似乎工作...在调试中。然后在发布测试时,它失败了?

假设单项选中,所以item1item2是一样的,所以不管精度如何,上面的长度应该是相等的....

在调试中,我没能看到这个失败...但在发布中,它总是失败!

上面的函数(length())return一个qreal

我看到的唯一解决方法是
- 实施我自己的平等检查,限制精度,或
- 将任何 qreal 值转换为 float.
但这是不合逻辑的(还有很多工作,我将不得不检查很多可能的地方)。

有人可以解释为什么会发生这种情况以及如何最好地解决这个问题吗?

如果您已经使用 Qt,您应该将浮点值与例如 qFuzzyCompare 进行比较。你不应该简单地使用 ==.

来比较两个浮点变量