【问题标题】:Where can I inspect Python's math functions?我在哪里可以检查 Python 的数学函数?
【发布时间】:2011-03-29 17:03:09
【问题描述】:

我想看看 Python 计算平方根的方式,所以我试图找到 math.sqrt() 的定义,但我在任何地方都找不到。我看过_math.cmathmodule.c 和其他地方。

我知道 python 使用 C 的数学函数,但这些函数是在 Python 发行版中的某个地方,还是与其他地方的代码相关联?我正在使用 Mac OS X。

math.sqrt()中的算法在哪里?

【问题讨论】:

    标签: python math sqrt


    【解决方案1】:

    这取决于实现。 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)(或类似的东西)
    【解决方案2】:

    有些模块是用 C 而不是 python 编写的,因此您将无法找到 .py 文件。您可以使用以下列表:

    import sys print sys.builtin_module_names

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

    【讨论】:

      【解决方案3】:

      【讨论】:

      • 知道了,太好了,谢谢。我想我之前错过了它,因为我正在寻找一种叫做“sqrt”的东西。
      • 这不是一个真正的答案。 cmath 是复数的数学模块。 c_sqrtsqrt 之上实现复数的平方根。 sqrt 的实际实现不存在于 cmath 源中。有关更多详细信息,请参阅我的答案。
      • 阿列克谢,我正要问这个!我做了一些调查,看来你是绝对正确的。 math.sqrt() 不适用于复数,但 cmath 中的函数显然可以。见docs.python.org/library/math.html。我刚刚从ftp.gnu.org/gnu/glibc 下载了 C 标准库源代码,希望能在其中找到更多答案。谢谢!
      • 不,我同意。乍一看是相当难以理解的。我还在 ieee754 目录中的 e_sqrt.c 中找到了另一个实现,至少看起来好像它可能正在计算 sqrts。对于不同的架构,似乎有很多不同的例程。我认为 sqrt() 为所有这些提供了一个包装器,尽管很难跟踪宏和#includes 从一个文件到另一个文件的踪迹!
      【解决方案4】:

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

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

      【讨论】:

      • 这并没有解释 python 是如何实际计算这些结果的。
      猜你喜欢
      • 1970-01-01
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多