私のコードでは、等価性のチェックが多数あります...
例えば:
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
なぜこれが起こっているのか、この問題を回避する最善の方法を誰かが説明できますか?