为什么“mat2str(0.005, 90)”返回在MATLAB 0.0050000000000000001吗?

10视图(30天)
根据文档:
“str = mat2str (A)将矩阵转换成一个字符串。这个字符串是适合eval函数的输入,这样eval (str)生产原始矩阵在15位精度的。”
我发现了一个叫“mat2str”90 -位精度在我们的代码——“mat2str(内容,90)”。这实际上产生值问题(参见下面的跟踪)。我们预期“mat2str”输出输入值的确切的表示,但实际上设置精度参数过高造成精度下降。
如果我们将精度参数设置为15,它保证任何输入少于15位小数点后将代表正确的输出字符串“mat2str”?如果不是,什么是保证精度mat2str(价值15)?
谢谢。
代码:
> > mat2str (0.005, 90)
ans =
0.0050000000000000001
> > mat2str (0.005, 17)
ans =
0.0050000000000000001
> > mat2str (0.005, 15)
ans =
0.005
> > mat2str (0.005, 16)
ans =
0.005

接受的答案

MathWorks支金宝app持团队
双精度数字存储在MATLAB使用64位按照IEEE标准浮点算术。与64位二进制表示,以10为底的最大可能精度是15到17位数。因此,它不应该无论0.05与超过15小数表示为一个字符串。
“mat2str”功能使用sprintf”打印一个n位数量。1快结束时出现“mat2str(0.005, 90)”是由于这一事实0.005在电脑上不能完全代表64位。然而,如果我们看的十六进制表示的输出“mat2str”,我们得到相同数量:
%的格式设置为十六进制
> >十六进制格式
% 0.005转换为一个字符串精确15位数
> > s = mat2str (0.005, 15)
s =
0.005
> > eval ()
ans =
3 f747ae147ae147b
% 0.05转换为一个字符串与90位精度
> > s = mat2str (0.005, 90)
s =
0.0050000000000000001
> > eval ()
ans =
3 f747ae147ae147b
字符串“s”可能不同,但垃圾最后数字并不重要。只有第一个小数点后15位数物质和评估“s”所示:我们获得相同的二进制数。
而不是使用“mat2str”您可以存储的确切表示十六进制形式。“num2hex”功能将一个双精度数转换成十六进制表示的字符串。这可能是一个更好的解决办法如果你只打算使用它在标量——“num2hex”并不在数组与“mat2str”。
2的评论
沃尔特·罗伯森
沃尔特·罗伯森 2021年4月19日
从历史上看,有一次在Windows很不好转换精度(失败! !),和Linux更好但仍然有限,但Mac版是完美的。

登录置评。

更多的答案(0)

类别

找到更多的在数值类型帮助中心文件交换

下载188bet金宝搏


释放

R2014a

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!