为什么Matlab和Mathematica之间存在显着的双精度差异?

时间:2013-11-06 09:28:49

标签: matlab wolfram-mathematica digits double-precision

我在Matlab中通过

创建了一个随机双精度值
x = rand(1,1);

然后按

显示x的所有可能数字
vpa(x,100)

并获得:

0.2238119394911369 7971853298440692014992237091064453125

我将x保存到.mat文件,并将其导入Mathematica,然后将其转换为:

y = N[FromDigits[RealDigits[x]],100]

并获得:

0.2238119394911369 0000

然后返回Matlab并使用(将所有Mathematica数字复制并粘贴到Matlab):

 vpa(0.22381193949113690000,100)

并获得:

0.22381193949113689 64518061375201796181499958038330078125

为什么同一双精度变量之间存在显着差异?

如何在Mathematica和Matlab之间交换数据时缩小差距?

2 个答案:

答案 0 :(得分:4)

您可以使用ReadList代替Import来解决此问题。我在下面添加了一些演示步骤来探索显示的舍入和相等性。请注意最终测试d == e?在Mathematica 7中是False,在Mathematica 9中是True,(包含所有预期的数字)。所以看起来版本9已经向Import添加了一些精度。演示使用了一个演示文件。

demo.dat的内容:

0.22381193949113697971853298440692014992237091064453125
"0.22381193949113697971853298440692014992237091064453125"

初​​探: -

a = Import["demo.dat"]
b = ReadList["demo.dat"]
a[[1, 1]] == a[[2, 1]]
b[[1]] == b[[2]]
a[[1, 1]] == b[[1]]
a[[1, 1]] == ToExpression@b[[2]]
b[[1]] // FullForm
c = First@StringSplit[ToString@FullForm@b[[1]], "`"]
b[[2]]
ToExpression /@ {c, b[[2]]}
d = N[FromDigits[RealDigits[a[[1, 1]]]], 100]
e = N[FromDigits[RealDigits[b[[1]]]], 100]
d == e

答案 1 :(得分:2)

精度与双值一样。双精度为53位,因此精度约为53 * log(10)/ log(2)= 16位有效数字。您有16位有效数字,它可以按预期工作。