我正在将Matlab程序导入Octave。我使程序正常工作。现在,一切似乎都可以从精度上很好地完成。
我发现Matlab和Octave对相同方程给出的结果略有不同。 例如,
pi = acos(-1.0);
mu_0 = 4*pi*10^(-7);
然后,Matlab和Octave为pi给出相同的结果。 但是,对于mu_0,Octave给出1.25663706143591 8 e-006,而MATLAB给出1.25663706143591 7 e-006。
最后一个小数位略有不同。它对最终结果的影响很大(结果的最大差约为0.0001,但我需要低于0.00000001),因为该程序有很多计算公式。
因此,我想知道是否可以使Octave与Matlab输出完全相同的结果?如果不能,我如何减小它们之间的差异?我可以通过编写一些代码或更改一些图形来解决这类问题吗?
非常感谢您的帮助。
PS:关键是使Octave与MATLAB输出相同的结果。(编辑后的程序与原始程序在计算上没有任何区别。)也许“可变精度算法”没有太大帮助,因为MATLAB也使浮点数舍入错误。
答案 0 :(得分:2)
Floating-point calculations are inherently imprecise。更改操作顺序通常会导致舍入错误发生变化,您将在最后一位看到(如果幸运的话,如果不幸的话,差异会更大!)。您不能期望两个不同的程序或在两个不同计算机上运行的同一程序来生成完全相同的浮点值。
如果这两个数字之间的差异是您的计算问题,那么您可能应该找出这种差异为何会放大的原因,并更改计算顺序,以使舍入误差不会造成太大危害。
另外两个建议:
请勿重新定义pi
。 It is a built-in function,当您分配给它时,它会被覆盖。
使用1e-7
,而不是10^(-7)
。它更易读,更容易键入。
答案 1 :(得分:1)
使用精度可变算术vpa
。
mu_0 = vpa(4e-7*pi,30); %Last number is the precision
编辑:正如克里斯在评论中所指出的那样,此解决方案需要符号工具箱,如果您无法使用该工具箱,则可以在此处下载其他工具:https://se.mathworks.com/matlabcentral/fileexchange/36534-hpf-a-big-decimal-class