-1

私のコードでは、等価性のチェックが多数あります...

例えば:

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

私が見る唯一の回避策は
、精度を制限する独自の同等性チェックを実装するか、値を に
キャストすることです。 しかし、それは非論理的です(そして多くの作業が必要です。潜在的な場所をたくさんチェックする必要があります)。qrealfloat

なぜこれが起こっているのか、この問題を回避する最善の方法を誰かが説明できますか?

4

1 に答える 1

2

qFuzzyCompareたとえば、すでに を使用している場合は、浮動小数点値を比較する必要がありますQt。を使用して 2 つの浮動小数点変数を比較しないでください==

于 2015-07-16T20:57:40.110 に答える