2 回答
TA贡献1802条经验 获得超10个赞
如果您不在同一个地方或使用完全相同的方程计算浮点数,那么此代码可能会出现假阴性(由于舍入错误)。例如:
>>> 0.1 + 0.2 in [0.6/2, 0.3] # We may want this to be True
False
在这种情况下,我们可以只使用一个自定义的“ in”函数来实际实现这一点(在这种情况下,使用numpy.isclose代替可能更好/更快numpy.allclose):
import numpy as np
def close_to_any(a, floats, **kwargs):
return np.any(np.isclose(a, floats, **kwargs))
文档中有一个重要的说明:
警告 默认atol值不适用于比较远小于 1 的数字(请参阅注释)。[...] 如果预期值明显小于 1,则可能导致误报。
该注释补充说,atol与math.isclose's相反,它不是零abs_tol。如果您在使用时需要自定义容差close_to_any,请使用kwargsto passrtol和/或atoldown to numpy. 最后,您现有的代码将转换为:
if close_to_any(myFloatNumber, myListOfFloats):
print('Found it!')
else:
print('Sorry, no luck.')
或者您可以有一些 options close_to_any(myFloatNumber, myListOfFloats, atol=1e-12),请注意这1e-12是任意的,除非您有充分的理由,否则不应使用此值。
回到我们在第一个示例中观察到的舍入误差,这将给出:
>>> close_to_any(0.1 + 0.2, [0.6/2, 0.3])
True
TA贡献1799条经验 获得超9个赞
Q1:取决于您将如何实施。但正如其他人提到的浮动,使用in运算符并不是一个好主意。
Q2:您在性能方面有任何限制吗?会myListOfFloats排序吗?
如果它是一个排序的浮点值列表,并且您需要尽可能快地完成它,则可以实现二进制搜索算法。
如果数据未排序,根据您将进行的查询数量与数据大小之间的比率,您可能希望对数据进行排序并保持排序。
如果您对性能和速度没有任何要求,可以使用以下示例作为基础:
def inrng(number1,number2,prec):
if(abs(number1-number2)<prec):
return True
else:
return False
precision=0.001
for i in myListOfFloats:
if(inrng(i,myInputNumber,precision)):
#do stuff
添加回答
举报