我最近发现,x**.5和math.sqrt(x)并不总是产生在Python相同的结果:
Python 2.6.1 (r261:67517, Dec 4 2008, 16:51:00) [MSC v.1500 32 bit (Intel)] on win32 >>> 8885558**.5 - math.sqrt(8885558) -4.5474735088646412e-13
检查所有低于10 ** 7的整数,这两种方法几乎对精确到0.1%的样本产生了不同的结果,对于较大的数字,误差的大小(缓慢地)增加。
所以问题是,哪种方法更准确?
哪一个都不是更准确的,它们都与实际答案在相等的部分上有所不同:
>>> (8885558**0.5)**2 8885557.9999999981 >>> sqrt(8885558)**2 8885558.0000000019 >>> 2**1023.99999999999 1.7976931348498497e+308 >>> (sqrt(2**1023.99999999999))**2 1.7976931348498495e+308 >>> ((2**1023.99999999999)**0.5)**2 1.7976931348498499e+308 >>> ((2**1023.99999999999)**0.5)**2 - 2**1023.99999999999 1.9958403095347198e+292 >>> (sqrt(2**1023.99999999999))**2 - 2**1023.99999999999 -1.9958403095347198e+292 http://mail.python.org/pipermail/python-list/2003-November/238546.html
math模块包装相同名称的平台C库数学函数;math.pow()如果您需要(或只想)与调用C的C扩展具有高度兼容性,则此功能最为有用pow()。 __builtin__.pow()是Python的infix** 运算符的实现,并且还处理复数,无穷整数幂和模幂(Cpow()不处理任何这些运算符 )。
math模块包装相同名称的平台C库数学函数;math.pow()如果您需要(或只想)与调用C的C扩展具有高度兼容性,则此功能最为有用pow()。
__builtin__.pow()是Python的infix** 运算符的实现,并且还处理复数,无穷整数幂和模幂(Cpow()不处理任何这些运算符 )。
__builtin__.pow()
Python
infix*
**更完整。math.sqrt可能只是sqrt的C实现,它可能与有关pow。