【问题标题】:why is there significant double precision difference between Matlab and Mathematica?为什么 Matlab 和 Mathematica 之间存在显着的双精度差异?
【发布时间】:2013-11-17 11:08:59
【问题描述】:

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

【问题讨论】:

  • 如果你想“精确地”传输“双精度”(64 位)数据,你应该使用标准的二进制格式,省去所有来回转换到 base 10 的问题。
  • 如果需要在保证不丢失的情况下传输双精度数据,最方便快捷的方式是使用MATLink。 (免责声明:我是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 引擎?谢谢
  • 嗨@Szabolcs,我发现MathLink 只传输双精度数据。如何将 Matlab 中双数的 Mathematica 工作精度设置为多精度?我能想象的唯一可靠的方法仍然是 N[FromDigits[RealDigits[x]],userPrecision]...

标签: matlab wolfram-mathematica digits double-precision


【解决方案1】:

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

【讨论】:

  • 谢谢。因为我想在 Mathematica 中使用高于双精度的精度进行进一步的多精度计算;这种转换应该是我能找到的唯一可靠的方法。
  • 使用OP的值N[x, 53]以3结尾,而N[FromDigits[RealDigits[x]], 53]以25结尾,所以我认为后者相当不错。
  • 我也认为mathematica在处理数字精度方面应该更胜一筹。 matlab 可以模拟与mathematica 相同的截断吗?
  • 100 是 N 的精度参数,而不是 FromDigits 的基本参数。
  • 谢谢我混淆了参数。更新了答案。
【解决方案2】:

您可以通过使用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

【讨论】:

  • 值得注意的是 Import 使用文件扩展名来确定如何处理文件。
猜你喜欢
  • 2012-05-25
  • 1970-01-01
  • 2016-03-23
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 2012-06-24
  • 2012-09-22
  • 1970-01-01
相关资源
最近更新 更多