[Development] integer bug in Qt4.8.x

Thomas Senyk thomas.senyk at pelagicore.com
Wed Mar 6 14:53:33 CET 2013


On Wed, March 06, 2013 12:25:32 Samuel Rødal wrote:
> On 03/06/2013 11:38 AM, Thomas Senyk wrote:
> > Hi,
> > 
> > I think I stumbled over a bug in Qt4.8.x - QtDeclarative, but I wanted to
> > asked for opinions first.
> > 
> > First of all: This is not happening in Qt5 (neither QtQuick2.0 nor QtQuick
> > 1.1)
> > 
> > This seems to only happen on ARM... at least I couldn't reproduce on any
> > x86 machine I tried.
> > 
> > The ARM system I tested on:
> >    - imx6
> >    - yocto based rootfs, sysroot and toolchain
> >    - Qt5 built using mkspecs/devices/linux-imx6-g++ (not haven the bug)
> >    - Qt4 built with my own mkspec based on the Qt5 device-mkspec
> >    - Qt4/5 source-code from git with a most recent checkout
> > 
> > The bug:
> > 
> > It's about imprecise 'int' in QtQuick1.1 / JS (only Qt4!)
> > A code snipped triggering it would be:
> > 
> > property int ex: 0
> > 
> > Component.onCompleted:
> > {
> > 
> >      var tmp;
> >      var c = 1;
> >      
> >      for ( tmp = ex + 1; /*forever*/; tmp++ )
> >      {
> >      
> >          if ( tmp !== ( ex + 1 ) )
> >          {
> >          
> >              console.log( "error: " + tmp + " != " + ex + " + 1" );
> >          
> >          }
> >          
> >          c = c+1;
> >          
> >          if ( c > 100000 )
> >          {
> >          
> >              console.log( tmp );
> >              c = 1;
> >          
> >          }
> >          
> >          ex = tmp;
> >      
> >      }
> > 
> > }
> > 
> > 
> > The log looks like:
> > 
> > ...
> > 8200000
> > 8300000
> > error: 8388610 != 8388610 + 1
> > error: 8388612 != 8388612 + 1
> > error: 8388614 != 8388614 + 1
> > error: 8388616 != 8388616 + 1
> > ...
> > 
> > 
> > where 8388610 == 0x800002
> > 
> > For me it looks a little bit like some sort of floating-point accuracy
> > problems ... or a casting-error ... ?
> > 
> > 
> > Greets
> > Thomas
> 
> Numbers in JavaScript are defined to be implemented as floating point.
> So I would expect the loop to end up printing error at some point.
> However, a JavaScript implementation is supposed to use double precision
> floating point numbers, in which case the loop would run for a really
> long time before printing out such an error (double can exactly
> represent all 32-bit integers).
> 
> However, with single precision floating point numbers you hit the
> problem a lot sooner, and this C program, using single precision
> floating point, shows the error happening at 16777216:
> 
> #include <stdio.h>
> int main(int argc, char **argv)
> {
>      volatile float value = 1;
>      volatile int v1, v2;
>      do {
>          v1 = value;
>          v2 = (float)(value + 1.0);
>          value = v2;
>      } while (v1 != v2);
>      printf("%d %d\n", v1, v1 / 2);
> }
> 
> So there's still something strange going on, since 16777216 is two times
> 8388608, which is where the error manifests in your example. Not sure
> what the explanation of that is, but at least I guess we can assume that
> the JavaScript engine used for QML in Qt 4 might use float (probably
> when qreal is float) and thus is not fully compliant.


I guess that's the answer/confirm I was looking for.

So -DQT_COORD_TYPE <something> could be one solution.
 ... although that would create more performance problems then using 'var' 
instead of 'int' for specific properties.

Thanks.

> 
> --
> Samuel
> _______________________________________________
> Development mailing list
> Development at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/development



More information about the Development mailing list