Android NDK fload增加准确性

时间:2011-07-28 08:00:49

标签: android floating-point android-ndk

我有问题。 我正在计算opengl渲染的一些点的位置。 但是计算是错误的,并且在渲染图像上产生一个像素重叠。 这是一个严重的问题,因为它看起来很讨厌。 最奇怪的是,简单的添加就会发生错误。

我只是为每一行和每列添加0.02,而且无处可出现0,009。 它来自哪里? 我试图将编译器从arm7更改为arm,但它没有帮助

代码:

for (int i=0;i<elem;i++)
    {
        LOGE("ROW: %d",i);

        startPosX = -(float)elem*vertSize/2.0f + vertSize/2.0f;

        for (int j=0;j<elem;j++)
        {
            LOGE("Column: %d",j);
            LOGE("x: %f  y: %f  vs:%f",startPosX,startPosY,vertSize);

            Vvertices[((i*elem*3)+j*3+0)] = startPosX;
            Vvertices[((i*elem*3)+j*3+1)] = startPosY;
            Vvertices[((i*elem*3)+j*3+2)] = z;              

            positions[i*elem+j].Set( startPosX, startPosY, z );

            if(randomType)
                velocity[i*elem+j].Set(getRandom()/speed,getRandom()/speed,getRandom()/speed);
            else
                velocity[i*elem+j].Set(0.0f,0.1f/speed,0.0f);

            startPosX+=vertSize;
        }
        startPosY +=vertSize;

    }

专栏:85 x:0.710000 y:0.989999 vs:0.020000

专栏:86 x:0.729999 y:0.989999 vs:0.020000

1 个答案:

答案 0 :(得分:1)

当您需要确保数学计算的精度时,使用诸如float之类的类型有时是个坏主意,因为许多数字在二进制中没有有限表示,就像一些分数没有十进制的有限表示一样。

此问题与数字的机器表示有关,而与您自己使用的编程语言无关。使用float和double类型的典型方法的许多语言都有这个问题。

在Java中,人们使用BigDecimal等类来处理这类问题。