Является ли катастрофическая отмена проблемой при вычислении скалярных произведений векторов с плавающей точкой? И если да, то как это обычно решается? - PullRequest
16 голосов
/ 15 января 2012

Я пишу симулятор физики на C ++ и беспокоюсь о надежности. Я читал, что в арифметике с плавающей запятой может произойти катастрофическая отмена, когда вычислена разница двух чисел почти равной величины. Мне пришло в голову, что это может произойти в симуляторе, когда вычисляется скалярное произведение двух почти ортогональных векторов. Однако ссылки, на которые я смотрел, обсуждают только решение проблемы путем переписывания соответствующего уравнения (например, квадратная формула может быть переписана для устранения проблемы) - но, похоже, это не применимо при вычислении точечного произведения? Думаю, мне было бы интересно узнать, обычно ли это проблема физических движков и как она решается.

Ответы [ 2 ]

13 голосов
/ 15 января 2012

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

В качестве альтернативы можно использовать суммирование Кахана при суммировании терминов.

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

Конечно, можно комбинировать оба вышеупомянутых подхода.

Обратите внимание, что выше описывается общее поведение ошибок для точечных продуктов, а не конкретно катастрофическое аннулирование.

5 голосов
/ 15 января 2012

Вы говорите в комментарии, что вы должны вычислить x1 * x2 + y1 * y2, где все переменные являются числами с плавающей точкой.Поэтому, если вы выполняете вычисления с двойной точностью, вы вообще не теряете точности, потому что двойная точность имеет более чем в два раза больше битов точности, чем float (при условии, что ваша цель использует IEEE-754 ).

В частности: пусть xx, yy будет действительным числом, представленным float переменными x, y.Пусть xxyy будет их произведением, а xy будет результатом умножения с двойной точностью x * y.Тогда во всех случаях xxyy - это действительное число, представленное xy.

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