【发布时间】:2017-02-23 17:20:35
【问题描述】:
由于浮点错误 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,这使它成为迄今为止最好的解决方案,但仍然存在一些错误。
【问题讨论】:
-
具体问题是什么?一般如何避免浮点不准确性?还是如何评估 2^(log(k) / log(2)) 而不准确?
-
不是 63 有什么问题?这只是
2*eps(63)的区别。一般来说,数值计算不应依赖于精确值。 -
@horcler 当您处理大数字时,它会显着提高。
-
@Paul Hankin 准确无误
标签: matlab precision logarithm