小编典典

x **。5或math.sqrt(x)中哪个更准确?

python

我最近发现,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%的样本产生了不同的结果,对于较大的数字,误差的大小(缓慢地)增加。

所以问题是,哪种方法更准确?


阅读 242

收藏
2021-01-20

共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()Pythoninfix** 运算符的实现,并且还处理复数,无穷整数幂和模幂(Cpow()不处理任何这些运算符 )。

**更完整。math.sqrt可能只是sqrt的C实现,它可能与有关pow。

2021-01-20