qreal равенства не удается в выпуске, но работает в отладке (и приведение к плаванию также работает)

В моем коде у меня есть большое количество проверок на равенство...

например:

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,
Но это нелогично (и много работы, я должен был бы проверить много потенциальных мест).

Может кто-нибудь объяснить, почему это происходит и как лучше обойти эту проблему?

1 ответ

Решение

Вы должны сравнить значения с плавающей точкой, например, с qFuzzyCompare если вы уже используете Qt, Вы никогда не должны сравнивать две переменные с плавающей точкой просто ==,

Другие вопросы по тегам