проблемы точности в Matlab при использовании arrayfun - PullRequest
0 голосов
/ 04 апреля 2020

Я использую Matlab. У меня есть функция f(x), и я хочу применить f(x) к набору значений. Итак, я написал 2 кода. Первый код простой для l oop. В какой-то момент x0, внутри этого для l oop, я обнаружил, что f(x0)=1.0000, а затем я использую f(x0)-1=-4.7684e-07.

Мой второй код использует arrayfun на f(x). И при том же входном значении x0 я обнаружил, что результат равен 1.0000, но arrayfun(f,x0)-1=4.7684e-07!

Эта ошибка 4.7684e-07 выглядит крошечной. Но for l oop дает мне число ниже 1, а arrayfun дает мне число выше 1. Это действительно большая разница в моей работе, поскольку мои последующие вычисления в значительной степени зависят от того, меньше это число или меньше 1 1, так как это число должно быть вероятностью.

Теперь мой вопрос: почему у arrayfun такая проблема? В моем коде нет случайных чисел, почему arrayfun дает другой результат, чем для l oop? кому я должен доверять? Есть ли способ избежать такой точности? Обратите внимание, что в этом коде все мои переменные имеют тип single. Это вызывает проблему?

1 Ответ

0 голосов
/ 04 апреля 2020

сложение и умножение не являются коммутативными с ограниченной точностью, а результаты зависят от порядка. Например, добавление (a + b + c + d) даст вам разные ответы, вплоть до ошибки округления с плавающей запятой, по сравнению с (a + c + d + b). Это особенно актуально для параллельных вычислений, где порядок накопления из нескольких параллельных потоков не обеспечивается.

Вы можете либо принудительно изменить порядок операций, либо использовать более высокую точность, например, double, чтобы уменьшить эту ошибку.

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