Точность сложения загрузки Android NDK - PullRequest
0 голосов
/ 28 июля 2011

У меня проблема. Я рассчитываю положение некоторых точек для рендеринга 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 х: 0,710000 у: 0,989999 против: 0,020000

Колонка: 86 х: 0,729999; у: 0,989999 против: 0,020000

1 Ответ

1 голос
/ 28 июля 2011

Когда вам нужна гарантированная точность для математических вычислений, иногда может быть плохой идеей использовать такие типы, как число с плавающей запятой, потому что многие числа не имеют конечного представления в двоичном, как некоторые дроби не имеют конечного представления в десятичном виде.

Эта проблема связана с машинным представлением чисел, а не с языком программирования, который вы используете сами.Эта проблема возникает во многих языках с типичными способами обработки типов с плавающей и двойной типами.

В Java люди используют такие классы, как BigDecimal, для решения подобных проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...