Python的数学函数在哪里可以查看?

27
我想研究一下Python如何计算平方根,所以我试图找到math.sqrt()的定义,但是我无法在任何地方找到它。我已经查看了_math.cmathmodule.c和其他地方。
我知道Python使用C语言的数学函数,但它们是否在Python发行版中,还是链接到其他代码中呢?我正在使用Mac OS X。 math.sqrt()算法在哪里?
4个回答

18
这取决于实现。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)(或类似的内容)。 - Noufal Ibrahim

2

有些模块是用C语言编写的,而不是Python,因此您无法找到.py文件。 您可以使用以下命令查看这些模块的列表:

import sys print sys.builtin_module_names

由于它是用C语言编写的,因此您必须在源代码中找到它。 如果您已经拥有源代码,则可以在模块目录中找到。


-1

明白了,太好了,谢谢。 我之前可能错过了它,因为我在寻找一个叫做“sqrt”的东西。 - Tom Scrace
6
这不是一个真正的答案。cmath是一个用于复数的数学模块。c_sqrtsqrt的基础上实现了复数的平方根。sqrt的实际实现不包含在cmath源代码中。有关更多详细信息,请参阅我的回答。 - Alexei Sholik
1
Alexei,我正想问这个问题!我进行了一些调查,似乎你是完全正确的。math.sqrt()不能用于复数,但是在cmath中的函数可以。请参见http://docs.python.org/library/math.html。我刚刚从http://ftp.gnu.org/gnu/glibc/下载了C标准库源代码,希望能找到更多答案。谢谢! - Tom Scrace
不,我同意。乍一看它相当难以理解。我还在ieee754目录中找到了另一个名为e_sqrt.c的实现,它至少看起来可能正在计算平方根。似乎有许多不同的例程适用于不同的架构。sqrt()函数提供了所有这些函数的包装器,尽管从一个文件到另一个文件的宏和#includes的轨迹有点难以跟踪! - Tom Scrace

-7
我不确定在哪里可以找到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

我希望你能看出这个模式。我也希望这对你有所帮助!:)


3
这并没有解释Python是如何实际计算这些结果的。 - Tony Suffolk 66

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接