Matlab числовая ошибка и как получить правильный ответ

Я как-то получаю следующее выражение в Matlab (R2014a на W7, 64b)

1/1034591578977116160000*prod(1:19)*(29576428208904825-17729494921579950*k - 20479697577410832*k^2 + 13867226524449248*k^3 - 836937224095392*k^4 - 869194297188672*k^5 + 163710902234880*k^6 + 2589894827520*k^7 - 2476912838400*k^8 + 144848704000*k^9) 

где k изначально символическая переменная. Затем я установил k=10 и получил результат 370371188237528, используя формат вывода LONGG. Но если я добавлю то же выражение в Mathematica (заменив prod(1:19) на 19!), Я получу 370371188237525, и я считаю, что это правильный ответ. Кажется, это ошибка округления, описанная много раз на этом сайте (это правильно?). Как мне избежать этого с или без Matlab символических инструментов?

1 ответ

Решение

Существует класс High Precision Float. После добавления его в путь вы можете просто написать k = hpf(10); перед оценкой вашего выражения. Результат будет

370371188237525.0106290979251578332118698122510380699168308638036

С помощью Symbolic Math Toolbox я бы написал

syms k
expr = 1/1034591578977116160000*prod(1:19)*(29576428208904825-17729494921579950*k - 20479697577410832*k^2 + 13867226524449248*k^3 - 836937224095392*k^4 - 869194297188672*k^5 + 163710902234880*k^6 + 2589894827520*k^7 - 2476912838400*k^8 + 144848704000*k^9);
subs(expr, k, 10);

который оценивает 3150006955960150124/8505 = 370371188237525,

Другие вопросы по тегам