小编Mar*_*ena的帖子

指数方程整数解的数值精度

我有一个依赖于整数输入xy的算法s
对于输入检查和引发无效参数的异常,我必须确保存在一个自然数,n以便x*s^n=y
Or 用语言来说:我必须多久进行一次链乘xs直到到达y
更重要的是:我y准确地到达了吗?

x这个问题可以通过除以: x*s^n=y => s^n=y/x => s^n=z
With来进一步抽象z=y/xz一般而言, 不是整数,但只有当能被 整除时,才能y使用整数乘法得出。所以这个属性可以很容易地首先被测试,然后保证它也是一个整数,现在它是解决。yxzs^n=z

已经有一个与此相关的问题。

有很多解决方案。有些是迭代,有些是使用对数求解方程,然后截断、舍入或与 epsilon 进行比较。我对对数解特别感兴趣。总体思路是:

def check(z,s):
    n = log(z)/log(s)
    return n == int(n)
Run Code Online (Sandbox Code Playgroud)

不过,比较浮点数的相等性似乎相当粗略。在正常情况下,我不会将其视为问题的一般且精确的解决方案。建议这种方法的答案没有提到精度问题,而使用 epsilon 进行比较的答案只是随机取一个小数字。

我想知道这种方法(具有直接相等性)到底有多强大,因为它似乎工作得很好,而且我无法通过反复试验来打破它。如果它在某个时刻发生故障,epsilon 必须有多小或多大。

所以基本上我的问题是:对数方法在特定情况下能否保证准确?例如有限的整数输入范围。

我想了很长时间,我认为这个解决方案至少在某些情况下可能是准确且稳健的。但我没有证据证明这一点。

我的思路是:
我能否找到一个组合,x,y,s使得链乘几乎没有错过y,这意味着n它将非常接近整数,但又不完全是?
答案是不。因为xys是整数,所以乘法也将是整数。因此,如果结果只是勉强错过y,那么至少也必须错过 …

algorithm math floating-point precision

5
推荐指数
1
解决办法
152
查看次数

标签 统计

algorithm ×1

floating-point ×1

math ×1

precision ×1