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

为什么Matlab和Mathematica之间存在显著的双精度差异?,matlab,wolfram-mathematica,digits,double-precision,Matlab,Wolfram Mathematica,Digits,Double Precision,我在Matlab中创建了一个随机的双精度值 x = rand(1,1); 然后显示x的所有可能数字 vpa(x,100) 并获得: 0.2238119394911369 7971853298440692014992237091064453125 0.2238119394911369 0000 0.22381193949113689 64518061375201796181499958038330078125 我将x保存到.mat文件,并将其导入Mathematica,然后将其转换为:

我在Matlab中创建了一个随机的双精度值

x = rand(1,1);
然后显示x的所有可能数字

vpa(x,100)
并获得:

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

y = N[FromDigits[RealDigits[x]],100]
并获得:

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

并获得:

0.2238119394911369 7971853298440692014992237091064453125
0.2238119394911369 0000
0.22381193949113689 64518061375201796181499958038330078125
为什么同一双精度变量之间存在显著差异


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

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

您可以通过使用
读取列表来解决此问题,而不是使用
导入
。我在下面添加了一些演示步骤来探索显示的舍入和相等。注意最后的测试
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

谢谢因为我想用Mathematica中高于两倍的精度来进行进一步的多精度计算;这样的转换应该是我能找到的唯一可靠的方法。使用OP的值
N[x,53]
以3结尾,但是
N[fromdights[realdights[x]],53]
以25结尾,所以我认为后者相当好。我还认为mathematica在处理数字精度方面应该更出色。matlab能像mathematica那样模拟相同的截断吗?100是N的精度参数,而不是FromDigits的基本参数。Thx我混淆了参数。更新的答案。如果你想“准确”传输“双精度”(64位)数据,你应该使用标准二进制格式,保存来回转换到10进制的所有问题。如果你需要传输双精度数据,同时保证不会丢失任何数据,最方便、最快的方法是使用。(免责声明:我是MATLink的开发者之一。)你会发现,在来回传输一个号码后,绝对没有区别。嗨,@Szabolcs,谢谢你的建议。这个难题来自于我在使用Mathematica和matlab/C++以多精度(高于两倍)求解非线性系统时的经验:Mathematica比其他“多精度”实现提供了更好、更精确的结果。我非常想了解Mathematica不可用或者Mathematica通常比其他实现慢,因此我更注重效率的时候出现这种问题的原因和如何避免。您好,@Szabolcs,我还注意到Mathematica中有一个“NETLink”这个软件包也可以用于Mathematica和Matlab之间的通信,有什么区别?我不仅想在matlab和mathematica之间传输数据,还想在mathematica中以多重精度计算原始的双精度。Mathlink是如何处理的?“N[FromDigits[RealDigits[x]],userPrecision]”与Mathlink的功能有什么区别?Mathlink是否支持在Matlab脚本中调用Mathematica引擎?Thankshi@Szabolcs,我发现MathLink只传输双精度数据。如何将Mathematica的双倍工作精度从Matlab设置为多精度?我能想象的唯一可靠的方法仍然是N[FromDigits[realdights[x]],userPrecision]…值得注意的是,Import使用文件扩展名来确定如何处理文件。