[Development] Comparing two reals in Qt code
Sean Harmer
sh at theharmers.co.uk
Thu Nov 29 19:38:55 CET 2012
On 29/11/2012 18:34, BRM wrote:
>> From: Alan Alpert <416365416c at gmail.com>
>> Sent: Thursday, November 29, 2012 11:52 AM
>> Subject: Re: [Development] Comparing two reals in Qt code
>>
>> On Thu, Nov 29, 2012 at 6:53 AM, Sean Harmer <sean.harmer at kdab.com> wrote:
>>> On Thursday 29 November 2012 15:01:05 Dominik Holland wrote:
>>>> Hi all,
>>>>
>>>> last month i had some performance problems on a QML animation running
>> on
>>>> low end hardware (imx233).
>>>> I debugged that problem and it was caused because of rounding errors
>>>> during the comparison of two reals.
>>>>
>>>> I fixed that problem by replacing the comparison by a qFuzzyCompare()
>> in
>>>> the Qt4 declarative source code.
>>>> Afterwards i checked whether qt5 has the same problem... and it has
>>>> exactly the same problem.
>>>>
>>>> Now i pushed my patch to gerrit
>>>> (https://codereview.qt-project.org/#change,40655) and looked again at
>>>> the code
>>>> for any other occurrences.
>>>>
>>>> What i found is, that this happens in many places and it would be a
>>>> really huge effort to change the code to compare the qreals in the
>> right
>>>> way.
>>>>
>>>> Is this already a known problem and do you think that it is worth to
>> try
>>>> to fix the code ?
>>> Also please be aware that qFuzzyCompare() is nto the right way to compare
>> two
>>> arbitrary floating point values. If one of them is zero or close to zero
>> the
>>> condition it tests for becomes impossible to satisfy.
>>>
>>> Something along the lines of
>>>
>>> fuzzyCompare(float p1, float p2)
>>> {
>>> if (qFuzzyIsNull(p1))
>>> return qFuzzyIsNull(p2);
>>> else if (qFuzzyIsNull(p2))
>>> return false;
>>> else
>>> return qFuzzyCompare(p1, p2);
>>> }
>>>
>>> is slightly better but still not fantastic. Comparing two floats that we do
>>> not know a priori is actually very difficult
>>>
>>> http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-
>>> numbers-2012-edition/
>>>
>>> I would love to see a better qFuzzyCompare() implementation in Qt but the
>>> existing one is used in so many places it would be a nightmare to introduce
>>> without unwanted side effects.
>> What about a second qFuzzyCompare using an absolute instead of
>> relative epsilon? Something like 1e-5 should give a decent answer for
>> values between 1e5 and -1e5, which could be used for values like on
>> screen positions.
>>
>> By having two functions for developers to choose from we'd mitigate
>> the a priori knowledge problem, because some developers will know
>> roughly which floats they're going to be testing and they can pick the
>> right function for that.
>>
> How about allow the epsilon to be specified as an argument?
> Then developers who need more resolution can get it, and it still mitigates the a priori issue
> as it is (i) better documented, and (ii) documented in user code for what the developer requires
> or thought they were getting.
I have a work in progress patch somewhere that does similar to what you
suggest with versions for absolute or relative comparisons using ideas
from the link I posted earlier. I'll tidy it up and see if it's good
enough to get into 5.1.
Cheers,
Sean
--
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.
More information about the Development
mailing list