我在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之间交换数据时缩小差距?
答案 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位有效数字,它可以按预期工作。