在Matlab中,63不等于2 ^(log(63)/ log(2))

时间:2017-02-23 17:20:36

标签: matlab precision logarithm

由于浮点错误2 ^(log(63)/ log(2))不等于63.检查以下结果:

format long;
>> 2^(log(63)/log(2))

ans =

  63.000000000000014

不幸的是,根据Matlab文档,我不能在对数上使用vpa:

  

与精确的符号值不同,本质上是双精度值   包含舍入错误。 以双精度调用vpa时   输入,vpa无法恢复丢失的精度,即使它返回   比双精度值更多的数字。但是,vpa可以   识别并恢复p / q形式的表达式的精度,   pπ/ q,(p / q)1 / 2,2q和10q,其中p和q是中等大小的整数。

那我怎么解决这个问题呢?我有非常大的数字,如2 ^ 200,我得到了很大的错误。

编辑:我不是在问为什么会这样。我问如何使这项工作100%准确,所以这不是重复。

目前为止的最佳解决方案:

不幸的是,@ Sardar_Usama建议的解决方案并不总是按预期工作。检查以下结果:

>> 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,这使得这是迄今为止最好的解决方案,但仍然存在一些错误。

1 个答案:

答案 0 :(得分:4)

如果你不能使用roundvpa,如果你有{em>符号数学工具箱,creating symbolic numbers,则处理此问题的方法会更慢。即。

a = sym(2^(log(63)/log(2)))

这会为您提供sym课程63,您可以稍后使用以下内容转换为double

double(a)

这是你得到的:

>> format long
>> a = sym(2^(log(63)/log(2)))

a =

63

>> double(a)

ans =

    63