Как работает 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)));
}