2015-03-09 3 views
0

Я заметил, что два дня назад у меня была какая-то странная странная проблема, когда моя библиотека превращала mat4 (матрица 4x4, строчный порядок) в quat (quaternion), когда у меня было 180 ° по осям z и 1 ° на х, все остальные значения работают нормально, то есть 180 ° и 2 ° или 179 ° и 1 ° и так далее ..Java, ошибка при добавлении

После некоторой глубокой отладки, я нашел проблему

double trace = 0, s, x, y, z, w; 

    trace = m.c0.x + m.c1.y + m.c2.z + 1; 

Это должно вернуться trace = 0, данный

m.c0.x -1.0 
m.c1.y -0.9998477 
m.c2.z 0.9998477 
trace 5.9604644775390625E-8 

Бу Это не ... Почему?

я нашел временное решение, вычисляя след, как:

trace += m.c0.x; 
    trace += m.c1.y; 
    trace += m.c2.z; 
    trace += 1; 

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

Ps: Я пытался преобразовать его в два раза, они раньше плавали, но ничего не изменилось. Here полный код

Характеристики: Java 7 x64 на Win7 x64.

+0

Типы с плавающей запятой 'float' и' double' не являются бесконечно точными. См. Http://floating-point-gui.de/ – Jesper

ответ

0

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

+0

И как именно вы предлагаете, чтобы OP выполнял тригонометрические вычисления с использованием 'BigDecimal'? Этот ответ неверен и бесполезен. –

+0

Пример @DavidWallace OP использует простое дополнение: 'trace = m.c0.x + m.c1.y + m.c2.z + 1;' Это отлично работает с 'BigDecimal'. – Ray

+0

Нет, OP связан с кодом, содержащим синусы, косинусы, arctangents и несколько других бит и частей, которые просто не существуют в 'BigDecimal'. Это не просто дополнение. –

-1

просто используйте класс BigDecimal для вычисления результата. Это будет правильно.

+0

Нет, не будет. Не с тригонометрическими функциями. Единственными числами, которые «BigDecimal» может правильно хранить, являются завершающие десятичные знаки. Этот ответ неверен. –

Смежные вопросы