2

我在 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 之间交换数据时如何弥合差距?

4

2 回答 2

4

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

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
于 2013-11-06T10:00:40.527 回答
2

精度与 double 值的预期一致。双精度有 53 位小数,因此精度约为 53*log(10)/log(2)=16 位有效数字。你有 16 位有效数字,它按预期工作。

于 2013-11-06T09:52:12.313 回答