den*_*var 9 python floating-point int type-conversion numerics
我一直在寻找一种比较Python中两个数字的通用方法.特别是,我想弄清楚它们是否相同.
Python中的数字类型是:
int, long, float & complex
Run Code Online (Sandbox Code Playgroud)
例如,我可以简单地说:2比较2个整数(一种数字):
a == b
Run Code Online (Sandbox Code Playgroud)
对于浮子,由于舍入精度,我们必须更加小心,但我可以在一定容差范围内对它们进行比较.
题
我们得到2个一般数字a和b:我们如何比较它们?我正在考虑将两者都转换为复数(如果类型是,那么它将具有0个虚部int)并在该域中进行比较?
这个问题比直接比较浮点数更普遍.当然,它与这个问题有关,但它不一样.
在Python 3.5(和Numpy)中你可以使用 isclose
阅读描述它的PEP 485,Python 3.5数学库列表和numpy.isclose了解更多信息.numpy版本适用于支持numpy的所有Python版本.
例子:
>>> from math import isclose
>>> isclose(1,1.00000000001)
True
>>> isclose(1,1.00001)
False
Run Code Online (Sandbox Code Playgroud)
可以改变相对和绝对容差.
相对容差可以被认为是+ - 两个值之间的百分比:
>>> isclose(100,98.9, rel_tol=0.02)
True
>>> isclose(100,97.1, rel_tol=0.02)
False
Run Code Online (Sandbox Code Playgroud)
绝对容差是两个值之间的绝对值.它与测试相同abs(a-b)<=tolerance
所有数字类型的Python都支持Python 3.5版本.(使用cmath复杂的版本)
我认为从长远来看,这是你对数字的更好的选择.对于较旧的Python,只需导入源代码即可.Github上有一个版本.
或者,(放弃错误检查和inf和NaN支持),您可以只使用:
def myisclose(a, b, *, rel_tol=1e-09, abs_tol=0.0):
return abs(a-b) <= max( rel_tol * max(abs(a), abs(b)), abs_tol )
Run Code Online (Sandbox Code Playgroud)
如果你想比较不同类型的数字,那么==运算符没有错:Python将处理类型转换.考虑以下:
>>> 1 == 1 + 0j == 1.0
True
Run Code Online (Sandbox Code Playgroud)
如果您正在进行可能导致精度损失的数学运算(尤其是使用浮点数),通常的技术是检查值是否在某个容差范围内.例如:
>>> (10**.5)**2
10.000000000000002
>>> (10**.5)**2 == 10
False
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您可以找到差异的绝对值,并确保它低于某个阈值:
>>> abs((10**.5)**2 - 10) < 1e-10
True
Run Code Online (Sandbox Code Playgroud)