Как работает qFuzzyCompare в Qt

в чем разница между:

if( a == b )

и

if( qFuzzyCompare(a, b) )

учитывая, что переменные a и b:

a = 1234.5678
b = 1234.5678

примечание: Я спрашиваю, потому что у меня возникли проблемы с сравнением двойников в Qt, и я хочу понять, как qFuzzyCompare строительство.

1 ответов


на официальная документация на qFuzzyCompare() на самом деле не объяснял, почему это нужно использовать, но в целом сравнение значений с плавающей запятой считается плохой практикой, потому что две, казалось бы, идентичные переменные с плавающей запятой могут отличаться из-за ошибок округления. Вы можете прочитать больше об этом и других gotchas переменных с плавающей запятой здесь.

при просмотре исходного кода для qFuzzyCompare() для double и float, соответственно, поставляется с Qt5.6.0 (удерживайте CTRL и щелкните по функции, чтобы увидеть это в QtCreator), следует, что он пытается уменьшить вероятность неточностей, чтобы встать на пути теста на равенство:

Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(double p1, double p2) Q_REQUIRED_RESULT Q_DECL_UNUSED;
Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(double p1, double p2)
{
    return (qAbs(p1 - p2) * 1000000000000. <= qMin(qAbs(p1), qAbs(p2)));
}

Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(float p1, float p2) Q_REQUIRED_RESULT Q_DECL_UNUSED;
Q_DECL_CONSTEXPR static inline bool qFuzzyCompare(float p1, float p2)
{
    return (qAbs(p1 - p2) * 100000.f <= qMin(qAbs(p1), qAbs(p2)));
}