【发布时间】:2011-03-29 17:03:09
【问题描述】:
我想看看 Python 计算平方根的方式,所以我试图找到 math.sqrt() 的定义,但我在任何地方都找不到。我看过_math.c、mathmodule.c 和其他地方。
我知道 python 使用 C 的数学函数,但这些函数是在 Python 发行版中的某个地方,还是与其他地方的代码相关联?我正在使用 Mac OS X。
math.sqrt()中的算法在哪里?
【问题讨论】:
我想看看 Python 计算平方根的方式,所以我试图找到 math.sqrt() 的定义,但我在任何地方都找不到。我看过_math.c、mathmodule.c 和其他地方。
我知道 python 使用 C 的数学函数,但这些函数是在 Python 发行版中的某个地方,还是与其他地方的代码相关联?我正在使用 Mac OS X。
math.sqrt()中的算法在哪里?
【问题讨论】:
这取决于实现。 CPython 使用标准 C 库中的数学函数。 Jython 最有可能使用 Java 的数学方法。以此类推。
实际上,Python 与数学函数的实际实现无关。这些与 IEEE 754 更相关,后者几乎专门用于表示当今计算机中的浮点数。
无论如何,就 CPython 而言,它的 math 模块只是 C 函数的一个薄包装(prooflink,在页面底部)。 C 函数作为标准 C 库的一部分实现。它通常包含在操作系统发行版中,并且很可能以二进制形式分发,没有来源。另请注意,许多微处理器对其中一些操作都有专门的指令,您的编译器很可能会利用这些指令,而不是跳转到 C 库中的实现。
我无法告诉您系统上标准 C 库中使用的确切算法。 here 解释了一些可能的算法。
在 OS X 的特定情况下,数学函数位于libSystem.dylib,不幸的是它不是开源的(只有stub code available on Apple's Open Source site)。但是,如果您有兴趣,可以拆卸它 - 在当前系统上,例如尝试
otool -tvV /usr/lib/system/libsystem_m.dylib
【讨论】:
ldd $(which python) | grep libm。它会告诉你libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fedd6561000)(或类似的东西)
有些模块是用 C 而不是 python 编写的,因此您将无法找到 .py 文件。您可以使用以下列表:
import sys
print sys.builtin_module_names
由于它是用 C 语言编写的,因此您必须在源代码中找到它。如果您已经拥有源代码,则它位于模块目录中。
【讨论】:
对代码进行简单的 grep 操作会有所帮助:
http://svn.python.org/view/python/trunk/Modules/cmathmodule.c?revision=76978&view=markup
【讨论】:
cmath 是复数的数学模块。 c_sqrt 在sqrt 之上实现复数的平方根。 sqrt 的实际实现不存在于 cmath 源中。有关更多详细信息,请参阅我的答案。
我不确定在哪里可以找到 Python 使用的确切算法,但我希望这对您有所帮助。在 Python 中计算平方根的最简单方法是使用 **(幂)运算符。我不知道您对索引做了多少工作,但平方根与将某些东西的幂次方相同。因此,如果这是真的,您可以使用:
print x**0.5
这将打印您在 x 位置输入的任何数字的平方根。当然,如果你使用的是 Python 3,那么你需要这样写:
print(x**0.5)
这将是创建算法来计算数字的平方根的最简单方法。这可以在如下函数中实现:
sqrt(x):
return x**0.5
对于其他根,例如三次根等,您可以使用如下函数:
root(x, root):
return x**root
当您将根号传递给函数时,使用十进制形式的索引号,例如:
2:0.5
3:0.33333333(重复)
4: 0.25
5:0.2
我希望你能看到这个模式。我也希望这对你有所帮助! :)
【讨论】: