2024-04-27 01:14:25 发布
网友
在检查浮点数之间的相等性时需要小心,并且通常应该考虑公差,例如使用numpy.allcose。在
问题1:使用“in”关键字检查特定浮点数的出现是否安全(或者是否有类似的关键字/函数用于此目的)?示例:
if myFloatNumber in myListOfFloats: print('Found it!') else: print('Sorry, no luck.')
问题2:如果没有,什么是整洁的解决方案?在
问题1: 取决于你将如何实现这一点。但正如其他人在floats中提到的那样,使用in运算符并不是一个好主意。在
in
问题2: 你对性能有什么限制吗? 将对myListOfFloats进行排序吗?在
myListOfFloats
如果这是一个浮点值的排序列表,并且需要尽可能快地执行,那么可以实现binary search算法。在
如果数据未排序,则根据要执行的查询数与数据大小之间的比率,可能需要对数据进行排序并保持排序。在
如果您对性能和速度没有任何要求,可以使用以下示例作为基础:
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
如果不在同一个位置或使用完全相同的公式计算浮点值,则此代码可能会出现误报(因为舍入错误)。例如:
>>> 0.1 + 0.2 in [0.6/2, 0.3] # We may want this to be True False
在这种情况下,我们可以使用一个自定义“in”函数来实现这一点(在这种情况下,使用^{}而不是^{}可能更好/更快):
文件中有一个重要说明:
Warning The default atol is not appropriate for comparing numbers that are much smaller than one (see Notes). [...] if the expected values are significantly smaller than one, it can result in false positives.
atol
注释补充道,atol与^{}的abs_tol不是零。如果使用close_to_any时需要自定义公差,请使用kwargs将rtol和/或{}传递给numpy。最后,您现有的代码将转换为:
abs_tol
close_to_any
kwargs
rtol
if close_to_any(myFloatNumber, myListOfFloats): print('Found it!') else: print('Sorry, no luck.')
或者您可以使用一些选项close_to_any(myFloatNumber, myListOfFloats, atol=1e-12),请注意,1e-12是任意的,除非您有充分的理由,否则不应使用此值。在
close_to_any(myFloatNumber, myListOfFloats, atol=1e-12)
1e-12
回到我们在第一个例子中观察到的舍入误差,可以得到:
>>> close_to_any(0.1 + 0.2, [0.6/2, 0.3]) True
问题1: 取决于你将如何实现这一点。但正如其他人在floats中提到的那样,使用
in
运算符并不是一个好主意。在问题2: 你对性能有什么限制吗? 将对
myListOfFloats
进行排序吗?在如果这是一个浮点值的排序列表,并且需要尽可能快地执行,那么可以实现binary search算法。在
如果数据未排序,则根据要执行的查询数与数据大小之间的比率,可能需要对数据进行排序并保持排序。在
如果您对性能和速度没有任何要求,可以使用以下示例作为基础:
如果不在同一个位置或使用完全相同的公式计算浮点值,则此代码可能会出现误报(因为舍入错误)。例如:
在这种情况下,我们可以使用一个自定义“} 而不是^{} 可能更好/更快):
^{pr2}$in
”函数来实现这一点(在这种情况下,使用^{文件中有一个重要说明:
注释补充道,} 的}传递给numpy。最后,您现有的代码将转换为:
atol
与^{abs_tol
不是零。如果使用close_to_any
时需要自定义公差,请使用kwargs
将rtol
和/或{或者您可以使用一些选项
close_to_any(myFloatNumber, myListOfFloats, atol=1e-12)
,请注意,1e-12
是任意的,除非您有充分的理由,否则不应使用此值。在回到我们在第一个例子中观察到的舍入误差,可以得到:
相关问题 更多 >
编程相关推荐