【问题标题】:63 is not equal to 2^(log(63)/log(2)) in Matlab [duplicate]63不等于Matlab中的2 ^(log(63)/ log(2))[重复]
【发布时间】: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


【解决方案1】:

如果您不能使用roundvpa,如果您有符号数学工具箱creating symbolic numbers 有一种较慢的处理方法。即

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

这将为您提供sym63,稍后您可以使用以下方法将其转换为double

double(a)

这就是你会得到的:

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

a =

63

>> double(a)

ans =

    63

【讨论】:

  • 不幸的是,这并不总是按预期工作。看看这个sym(2^(log(2251799813685247)/log(2))) = 2251799813685259。 (顺便说一句,2251799813685247 是 2^51)另一方面,2^(log(vpa(2251799813685247))/log(vpa(2))) 更接近于2251799813685247。它的错误在~2.252*10^-192 附近,这对我的计算没有造成任何麻烦,但仍然存在一些错误。
  • @Kitiara 只有两个选项:符号算术数值算术(其中包括可变精度双精度)。 没有没有其他选择。获得 100% 的准确率并不总是可能的。阅读这篇文章:mathworks.com/help/symbolic/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多