由于浮点错误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,这使得这是迄今为止最好的解决方案,但仍然存在一些错误。
答案 0 :(得分:4)
如果你不能使用round
或vpa
,如果你有{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