使用数学模块中的平方根函数

lil*_*ian 3 python math square-root

我知道我可以使用找到表达式的平方根math.sqrt(x).

我也知道我可以找到平方根x**0.5.

两个为什么呢?这不是非pythonic吗?有什么用的math.sqrt()时候,我们可以直接将其提升到0.5次方?

tel*_*tel 5

显然已经讨论过堆栈溢出已经半死不活.以下是最有趣的部分摘要:

哪个更快

结论:math.sqrt在大多数Python版本/实现中明显更快.

哪个更准确?

结论:两者都没有,它们在略微不同的方面都是平等的(以相当显着的精确度).

编辑:

由于@MarkDickinson在下面的评论中讨论的原因,上面链接的"哪个更准确"问题中的信息不准确且已过时.这是有道理的,因为它已有近10年的历史.

我可以确认接受的答案中列出的测试现在返回不同的答案:

    (8885558**0.5)**2: 8885558.000000002
math.sqrt(8885558)**2: 8885558.000000002

                2**1023.99999999999: 1.7976931348498497e+308
(math.sqrt(2**1023.99999999999))**2: 1.7976931348498495e+308
    ((2**1023.99999999999)**0.5)**2: 1.7976931348498495e+308

    ((2**1023.99999999999)**0.5)**2 - 2**1023.99999999999: -1.99584030953472e+292
(math.sqrt(2**1023.99999999999))**2 - 2**1023.99999999999: -1.99584030953472e+292
Run Code Online (Sandbox Code Playgroud)

在线尝试自己测试.我在网上口译员得到的结果与我在几台实验室机器上的结果相同(无疑是x86-64).

上帝的话(即圭多)

Guido(Python的生活的仁慈独裁者)回应了OP发送的"更快"问题的电子邮件:

pow和**是等价的; math.sqrt不适用于复数,也不适用于C sqrt()函数的链接.至于哪一个更快,我不知道......

虽然他没有直接解决重复的原因,但他清楚地意识到这一点,并指出至少在某些情况下他们确实有不同的行为.

  • 您链接到的"更准确"的答案存在严重缺陷.在主流机器上,期望`sqrt`函数最终使用处理器的`sqrt`(例如,在具有SSE2的x86-64机器上的`SQRTSD`)是合理的,这可能是正确舍入的.找到"sqrt"不如"x**0.5"准确的情况会非常令人惊讶,并且在找到相反情况的情况下并不奇怪.简而言之,在典型的机器上,`sqrt`至少与'x**0.5`一样准确,并且在某些情况下很可能更准确. (2认同)