当前位置: 首页 > 面试题库 >

python中的近似比较

严朝明
2023-03-14
问题内容

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

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

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

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

编辑:

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

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

我的原因是:

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

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

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

编辑2。

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


问题答案:

您的定义有两个问题:

  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:您写道:

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

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



 类似资料:
  • 一些async fn状态机可以安全地越过线程发送,而其他则不能。判断一个async fn Future是不是Send,由非Send类型是否越过一个.await据点决定的。当可以越过了.await据点,编译器会尽力去估计这个是/否。但是今天的许多地方,这种分析都太保守了。 例如,考虑一个简单的非Send类型,也许包含一个Rc: use std::rc::Rc; #[derive(Default)]

  • 回忆上一节的内容。跳字模型的核心在于使用softmax运算得到给定中心词$w_c$来生成背景词$w_o$的条件概率 $$P(w_o \mid w_c) = \frac{\text{exp}(\boldsymbol{u}_o^\top \boldsymbol{v}c)}{ \sum{i \in \mathcal{V}} \text{exp}(\boldsymbol{u}_i^\top \boldsy

  • 试图写一个程序在Java计算幂级数近似in(x)使用以下公式: 我是用while循环来做的,我似乎无法100%正确地得到sin近似值。你知道我哪里出错了吗? 这目前给了我以下输出:

  • 校验者: @FontTian @numpy 翻译者: @程威 这个子模块包含与某些 kernel 对应的特征映射的函数,这个会用于例如支持向量机的算法当中(see 支持向量机)。 下面这些特征函数对输入执行非线性转换,可以用于线性分类或者其他算法。 与 kernel trick 相比,近似的进行特征映射更适合在线学习,并能够有效 减少学习大量数据的内存开销。使用标准核技巧的 svm 不能有效的适用

  • 为了让大家直观地感受这一系列过程是如何近似模拟一种语言的,我们构造了英文的一些典型近似序列,并给出如下。在所有情况下,我们假定“字母表”中有27个符号——26个字母和一个空格。 零阶近似(符号的选择相互独立,概率相等)。 XFOML RXKHRJFFJUJ ZLPWCFWKCYJ FFJEYVKCQSGHYD QPAAMKBZAACIBZLHJQD。 一阶近似(符号的选择相互独立,但其概率与英文文