在Matlab中,63不等于2^(log(63)/log(2))
由于浮点错误,2^(log(63)/log(2))不等于63。检查以下结果:在Matlab中,63不等于2^(log(63)/log(2)),matlab,precision,logarithm,Matlab,Precision,Logarithm,由于浮点错误,2^(log(63)/log(2))不等于63。检查以下结果: format long; >> 2^(log(63)/log(2)) ans = 63.000000000000014 >> sym(2^(log(2251799813685247)/log(2))) ans = 2251799813685259 不幸的是,根据Matlab文档,我不能在对数上使用vpa: 与精确的符号值不同,双精度值是固有的 包含舍入错误当您以双精度调用vpa时
format long;
>> 2^(log(63)/log(2))
ans =
63.000000000000014
>> sym(2^(log(2251799813685247)/log(2)))
ans =
2251799813685259
不幸的是,根据Matlab文档,我不能在对数上使用vpa:
与精确的符号值不同,双精度值是固有的
包含舍入错误当您以双精度调用vpa时
输入时,vpa无法恢复丢失的精度,即使它返回
大于双精度值的数字。然而,vpa可以
识别并恢复p/q形式表达式的精度,
pπ/q,(p/q)1/2,2q和10q,其中p和q是中等大小的整数
那么我该如何解决这个问题呢?我有非常大的数字,比如2^200,而且我会有非常大的错误
编辑:我不是问为什么会这样。我在问如何使这项工作100%准确,这样就不会重复
迄今为止最好的解决方案:
不幸的是,@Sardar_Usama建议的解决方案并不总是如预期的那样有效。检查以下结果:
format long;
>> 2^(log(63)/log(2))
ans =
63.000000000000014
>> sym(2^(log(2251799813685247)/log(2)))
ans =
2251799813685259
另一方面
>> 2^(log(vpa(2251799813685247))/log(vpa(2)))
ans =
2.2517998136852470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0*10^0*10^15
更接近2251799813685247=2^51。它的误差约为~9.491*10^-494,这是迄今为止最好的解决方案,但仍然存在一些误差。如果您不能使用
round
或vpa
,那么如果您有符号数学工具箱,则有一种较慢的处理方法。i、 e
这将为您提供sym
类63
,您可以在以后使用该类转换为:
这是您将得到的:
>> format long
>> a = sym(2^(log(63)/log(2)))
a =
63
>> double(a)
ans =
63
如果您不能使用
round
或vpa
,那么如果您有符号数学工具箱,则可以通过以下方式使用较慢的方法来处理此问题。i、 e
这将为您提供sym
类63
,您可以在以后使用该类转换为:
这是您将得到的:
>> format long
>> a = sym(2^(log(63)/log(2)))
a =
63
>> double(a)
ans =
63
具体问题是什么?一般来说,它是如何避免浮点不准确的?或者它是如何评估2^(log(k)/log(2))而不存在不精确性的?它不准确有什么错?这只是一个
2*eps(63)
差异。一般来说,数值计算不应该依赖于精确的数值。@horcler当你处理大数值时,数值会明显升高。@Paul Hankin没有不准确的地方具体的问题是什么?一般来说,它是如何避免浮点不准确的?或者它是如何评估2^(log(k)/log(2))而不存在不精确性的?它不准确有什么错?这只是一个2*eps(63)
差异。一般来说,数值计算不应该依赖于精确的数值。@horcler当你处理大的数字时,数值会变得更高。@Paul Hankin,没有不准确的地方。不幸的是,这并不总是按预期的那样工作。查看这个sym(2^(log(2251799813685247)/log(2))
=2251799813685259
。(顺便说一句,2251799813685247是2^51)另一方面,2^(log(vpa(2251799813685247))/log(vpa(2))
更接近于2251799813685247
。它的错误大约是~2.252*10^-192
,这不会给我的计算带来任何麻烦,但仍然有一些错误。@Kitiara只有两个选项:符号算术和数字算术(包括可变精度和双精度)。没有其他选择。要获得100%的准确度并不总是可能的。阅读这篇文章:不幸的是,这并不总是如预期的那样工作。查看这个sym(2^(log(2251799813685247)/log(2))
=2251799813685259
。(顺便说一句,2251799813685247是2^51)另一方面,2^(log(vpa(2251799813685247))/log(vpa(2))
更接近于2251799813685247
。它的错误大约是~2.252*10^-192
,这不会给我的计算带来任何麻烦,但仍然有一些错误。@Kitiara只有两个选项:符号算术和数字算术(包括可变精度和双精度)。没有其他选择。要获得100%的准确度并不总是可能的。阅读本文: