dlmwrite / dlmread 的精度问题 [重复]

Posted

技术标签:

【中文标题】dlmwrite / dlmread 的精度问题 [重复]【英文标题】:Precision issues with dlmwrite / dlmread [duplicate] 【发布时间】:2016-01-02 14:03:03 【问题描述】:

我最近非常严厉地发现,Matlab 的 dlmreaddlmwrite 不会以 double 的精度存储数值。它会影响我的代码,我需要更精确地存储大数组。

一个(非)工作示例:

pi1 = pi;
dlmwrite('pi',pi1);
pi2 = dlmread('pi');
pi1-pi2

ans =

-7.3464e-06

虽然我希望得到机器错误的答案,但准确度为 10^-14。

我宁愿继续使用dlmwrite 这样的简单函数,但我会考虑其他解决方案。

谢谢

【问题讨论】:

RTFM:The default precision is 5 significant digits and it supports C-style format strings。作为替代方案,dlmwrite 是低级 fwrite 函数的包装器。 【参考方案1】:

您可以使用函数的precision 属性获得更精确的结果。检查这个例子:

format long
S = pi * rand

S =

   2.869454879612631

dlmwrite('test1.txt',S,'precision','%10.3f');
dlmwrite('test2.txt',S,'precision','%10.5f');
dlmwrite('test3.txt',S,'precision','%10.9f');
dlmwrite('test3.txt',S,'precision','%2.14f');

结果如下:

带有 3 位小数的 test1.txt 2.869

带有 5 位小数的 test2.txt 2.86945

带有9位小数的test3.txt 2.869454880

14 位小数的test4.txt 2.86945487961263

【讨论】:

以上是关于dlmwrite / dlmread 的精度问题 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Matlab dlmread 函数:指定范围以仅考虑前 4 列

dlmwrite 在循环中使用单元格类型作为名称

MATLAB如何保存数据(转载)

java中的舍入双[重复]

Matlab中,如何将所写的文件保存到一个指定文件夹里?

Matlab数据处理——数据的保存和读取方法操作