【问题标题】:how does python calculate square roots?python如何计算平方根?
【发布时间】:2015-12-13 04:48:52
【问题描述】:

我注意到在 python 中平方根非常快。

import time
a = time.time()
print((1234567891011121314151617181920**8)**0.5)
d = time.time()-a
print(d)

输出:

2.32305723559e+120
0.0150001049042

这是一个 200+ 位数的数字,不到 0.1 秒!

那么这一切背后的算法是什么?

【问题讨论】:

  • 注意:123...1920**8 被计算为一个 bigint,然后将其转换为浮点 double 以进行平方根运算。因此,平方根对 64 位 FP 数进行运算,而不是“200 位”完全准确的整数。

标签: python number-theory


【解决方案1】:

在这种情况下,CPython 只是调用 C 内在函数 pow,让编译器随心所欲地处理它。 How to: pow(real, real) in x86 是解释在处理器级别快速实现 pow 的一个例子。

【讨论】:

  • @NickBastin,AFAIK 如果您使用 math.sqrt,它应该调用 libm sqrt,但在这种情况下,OP 使用了 some_float ** 0.5,我们将按照代码路径将我们带到 github.com/python/cpython/blob/master/Objects/…跨度>
  • 您能否准确说明我们是如何结束sqrt 电话的?
  • 我在一个函数上做了一个dis.dis(),它在我们的内部 Python 上从 ** 0.5 直接执行 sqrt,但这似乎是我们优化的东西。典型的 CPython 似乎将其组装为 BINARY_POWER,所以我收回我的 sqrt 评论...
猜你喜欢
  • 2012-08-31
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
  • 2021-08-03
  • 2020-03-19
  • 2021-05-08
  • 2012-09-25
相关资源
最近更新 更多