为什么在整数除法中添加 Epsilon 不能防止零除?

问题描述 投票:0回答:1

我知道有更好的方法来处理整数除法中的除零。然而,出于教育目的,我很好奇为什么在函数中向除数添加一个小的 epsilon 值 (1e-7) 会导致运行时错误,而不是防止被零除。这是代码片段:

def kangaroo(x1, v1, x2, v2):
    if (x2-x1) % (v1-v2) == 0 and (x2-x1) / ((v1-v2) + 1e-7) >= 0: # adding epsilon
        return "YES"
    else: 
        return "NO"

在此函数中,我尝试将 1e-7 添加到除数 (v1-v2) 以防止被零除。我的期望是,即使 (v1-v2) 为零,这也能让除法继续进行而不会出现错误。我还尝试使用更大的 epsilon 值,例如 1e-1,但这种方法在某些情况下仍然会导致运行时错误。有人可以解释为什么这个特定的实现失败并讨论在整数算术中使用如此小的 epsilon 的含义,以及为什么像 1e-1 这样更大的 epsilon 值不能解决问题?

python floating-point divide-by-zero epsilon
1个回答
0
投票

这种方法会导致运行时错误。当

v1-v2
为零时,第一个条件
(x2-x1) % (v1-v2)
将无法执行并导致运行时错误。当
v1-v2
非零并整除
x2-x1
时,您编写的代码将运行良好。在这种情况下,
epsilon
将自动添加到
v1-v2
。该误差与所选的
epsilon
的大小无关,因为甚至在我们评估第二部分之前第一个条件就已经失败了。

更好的解决方案是:

if (x2-x1) % ((v2-v1) + epsilon) == 0:
    return "YES"
else:
    return "NO"

或者也许是这个:

if (v2-v1) == 0:
   v2 += epsilon

if (x2-x1) % (v2-v1) == 0:
    return "YES"
else:
    return "NO"

第二个解决方案仅在差值为零时添加 epsilon,而另一个解决方案何时添加 epsilon,无论值是多少,因为对于

1e-4
或更高阶的差值,添加
1e-7
不会产生太大的误差。不同之处。第一种方法可能需要几毫秒的执行时间,具体取决于您构建代码的方式。

© www.soinside.com 2019 - 2024. All rights reserved.