一尘不染

python中的近似比较

python

我想让’==’运算符在我的程序中使用近似比较:如果x和y的浮点值相等(==)

abs(x-y)/(0.5(x+y)) < 0.001

有什么好的方法呢?鉴于float是内置类型,我认为我不能重新定义==运算符,可以吗?

请注意,我想使用float的其他功能,唯一要更改的是相等运算符。

编辑:

感谢您的回答,我了解您关于可读性和其他问题的观点。

也就是说,如果可能的话,我真的更希望实际上继续使用常规的float类型,而不是使用新的类或新的比较函数。甚至可以为常规浮点数重新定义==运算符吗?

我的原因是:

(a)使用我编写的程序的每个人都希望以这种方式比较浮点数

(b)世界上没有人会想对浮点数使用默认==。为什么甚至在语言中也是如此?

(c)我不喜欢守则中多余的字眼;显然,使用现有的float不会导致代码发生任何变化

编辑2。

现在,我知道我不能重载==运算符的float值,我必须更改我的问题。它将变得如此不同,我将在自定义比较中为内置容器创建一个新容器


阅读 423

收藏
2021-01-20

共1个答案

一尘不染

您的定义有两个问题:

  1. 缺少 *

  2. 将尝试除以零,如果x + y == 0.0(其中涵盖了可能是常见的情况x == y == 0.0

尝试以下方法:

define approx_Equal(x, y, tolerance=0.001):
    return abs(x-y) <= 0.5 * tolerance * (x + y)

编辑:请注意需要使用<=而不是<…来使x == y == 0.0案例正常工作。

我不会尝试覆盖 ==

编辑2:您写道:

世界上没有人会想对浮点数使用默认==。为什么甚至在语言中也是如此?

没门?假设您有一个返回浮点数的函数,并且对算法产生了很大的兴趣,该算法将更快和/或更优雅地产生相同的答案;你如何测试呢?

2021-01-20