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
,