[Development] Should QVariant be doing fuzzy comparisons on doubles?
Thiago Macieira
thiago.macieira at intel.com
Tue Sep 20 18:51:31 CEST 2016
On terça-feira, 20 de setembro de 2016 11:29:32 PDT Olivier Goffart wrote:
> > Is such a behavior change really acceptable for 5.8? I think it can break
> > applications that were relying on the current behavior in pretty bad, hard
> > to debug ways (random bugs based on rounding errors).
>
> I tend to agree with that.
> This is a behavior change, and i see no reason to do it. Comparing double
> for equality with operator== is a bad idea.
> I know QVariant::operator== has problems, but i don't think this is
> something that should be changed.
I did add a changelog for important behaviour change and I do think it should
be changed. Fuzzy comparisons only operate on certain values. We know there's
a problem with them when both numbers are close to zero: for example, fuzzy
comparing 1.2e-12 to 0 is false, comparing it to -1.2e-12 is false, even
though they could be the result from the same operation.
I also think that if you want a fuzzy comparison in variants, you should call
qFuzzyCompare(QVariant, QVariant) (which doesn't exist, I can add it).
> (Correct me if i'm wrong, but this might actually have quite some bad
> performance impact on QML where lot of bindings are done on a real value and
> they are compared for equality before emiting the changed signal. (or does
> QML takes the value out of qvariant before comparing?))
Question for Simon.
> On the other hand, the fact that qFuzzyCompare(inf, -inf) returns true looks
> like a bug within qFuzzyCompare.
And I will reject any patch that adds more complexity in qFuzzyCompare for a
0.01% corner-case. Instead, we should document that it only works for finite
numbers far enough away from zero. If your number can be infinite or NaN or
zero, you have to find something else.
--
Thiago Macieira - thiago.macieira (AT) intel.com
Software Architect - Intel Open Source Technology Center
More information about the Development
mailing list