某些MATLAB函数仅精确到某个十进制吗? MATLAB到底有多精确?

时间:2019-06-05 20:20:48

标签: matlab interpolation precision

我正在将程序从MATLAB 2012转换为2016。我遇到了一些奇怪的错误,我相信其中一些是由于MATLAB函数的精度不足所致。

例如,我有一个时间序列oldTs

Time                   Data
-----------------------------
1.00000000000000001    1.277032377439511
1.00000000000000002    1.277032378456123
1.00000000000000003    1.277032380112478

我还有另一个时间序列newTs,它的数据相似,但是有更多的行。 oldTs可能有500万行,而newTs可能有100万行。我想用新的时间序列插入旧时间序列中的数据,例如:

interpolatedTs = interp(oldTs.time, oldTs.data, newTs.time)

这给我一个错误:x values must be distinct

问题是,我的x值 是不同的。我认为MATLAB可能会截断某些数据,因此认为某些数据不是唯一的。我发现其他MATLAB函数可以做到这一点:

test = [1.00000000000000001, 1.00000000000000002, 1.0000000000000000003]
unique(test)

ans =
     1

test2 = [10000000000000000001, 10000000000000000002, 10000000000000000003]
unique(test2)

ans =

     1.000000000000000e+19

MATLAB认为此向量中只有一个唯一值,而不是三个!对我来说,这是一个巨大的问题,因为我需要使用数据保持最高的准确性和精度,而我不能牺牲任何精度。速度/存储不是一个因素。

默认情况下,某些MATLAB函数是否将数据截断到第n个小数位?这已从MATLAB 2012更改为MATLAB 2016吗?有没有一种方法可以强制MATLAB对程序使用一定的精度?为什么MATLAB首先要这样做?

任何对此主题的了解都值得赞赏。谢谢。

1 个答案:

答案 0 :(得分:1)

不,自2012年以来,或者从MATLAB的第一个版本开始,情况就没有改变。 MATLAB默认情况下使用并且一直使用双精度浮点值(8字节)。可以表示的第一个大于1的值是1 + eps(1),带有eps(1) = 2.2204e-16。基本上,您可以玩的少于16个十进制数字。在双精度浮点表示中,您的值1.000000000000000011相同。

请注意,这不是特定于MATLAB的东西,它是您的硬件遵循的标准。 MATLAB仅使用您的硬件功能。

使用Symbolic Math Toolbox中的variable precision arithmetic处理更高精度的数字:

data = [vpa(1) + 0.00000000000000001
        vpa(1) + 0.00000000000000002
        vpa(1) + 0.00000000000000003]

data =

 1.00000000000000001
 1.00000000000000002
 1.00000000000000003

请注意,vpa(1.00000000000000001)将不起作用,因为该数字首先被解释为双精度浮点值,并且只有在转换为VPA之后,但损坏已在那一点上完成。

还请注意,使用VPA进行算术的速度要慢得多,并且可能根本无法进行某些操作。