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, Вы никогда не должны сравнивать две переменные с плавающей точкой просто ==,

2

Другие решения


По вопросам рекламы [email protected]