Matlab数值误差以及如何得到正确的答案

时间:2014-11-28 12:10:10

标签: matlab rounding-error symbolic-computation

我以某种方式在Matlab中获得以下表达式(W7,64b上的R2014a)

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并使用LONGG输出格式得到结果370371188237528。但如果我把相同的表达式用于Mathematica(用19代替prod(1:19)!),我得到370371188237525,我认为这是正确的答案。这似乎是在这个网站上多次描述的舍入错误(它是否正确?)。如何使用或不使用Matlab符号工具箱来避免它?

1 个答案:

答案 0 :(得分:1)

High Precision Float课程。将其添加到路径后,您只需在评估表达式之前编写k = hpf(10);。结果将是

370371188237525.0106290979251578332118698122510380699168308638036

使用符号数学工具箱我会写

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