【问题标题】:Where is pow function defined and implemented in C?在 C 中定义和实现的 pow 函数在哪里?
【发布时间】:2010-12-14 13:20:47
【问题描述】:

我读到 pow(double, double) 函数是在“math.h”中定义的,但我找不到它的声明。

有人知道这个函数在哪里声明的吗?它是在哪里用 C 实现的?

参考:

http://publications.gbdirect.co.uk/c_book/chapter9/maths_functions.html

【问题讨论】:

  • 如果它不是直接在math.h 中,只要您为 C 运行时库标记包含文件目录,具有标记功能(或类似功能)的体面的编辑器就会带您直接进入声明。几乎所有体面的编程编辑器都具备这种能力。
  • 我不知道您使用的是什么编译器,但对于 MSVC 9 来说,pow() 的源代码不包括在内。该实现似乎位于库 tran.lib 中,其中不包含源代码。

标签: c function declare pow


【解决方案1】:

很多时候,诸如<math.h> 之类的包含文件将包含其他实际声明您希望在<math.h> 中看到的函数的头文件。这个想法是当程序包含 <math.h> 时,即使实际的函数定义在其他一些头文件中,程序也会得到它所期望的。

找到诸如pow() 之类的标准库函数的实现 完全是另一回事。您必须挖掘 C 标准运行时库的源代码并在其中找到实现。

【讨论】:

  • 请注意,大多数编译器确实为库提供源代码。但有时它可能是一个迷宫。
【解决方案2】:

定义的位置取决于您的环境。代码位于某个已编译的 C 标准库中。

它的“定义”在您的 c 标准库分发的源代码中。一种这样的发行版是 eglibc。这可以在线浏览,也可以在源代码分发中浏览:

w_pow.c

math_private.h

简答:在 C 标准库源代码中。

【讨论】:

  • w_pow.c 不是一个非常有用的链接,因为它基本上只是调用__ieee754_pow(x, y); 这是真正的定义......
【解决方案3】:

pow 的实际实现可能因编译器而异。通常,math.h(或 math.h 包含的供应商特定文件)为 pow(即其声明)提供 prototype,但实现隐藏在某些库文件中,例如libm.a.根据您的编译器,pow 或任何其他库函数的实际源代码可能不可用。

【讨论】:

    【解决方案4】:

    声明:在您的系统/SDK 的包含目录中(例如:/usr/include;/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.2.sdk/usr/包括/架构/arm/math.h)

    定义(实现):

    • 作为(编译后的二进制代码):在系统/SDK 的库目录中(例如:/usr/lib(如果是数学库,则为 libm.dylib)
    • 作为源代码(程序代码):这是有趣的部分。我现在在 Mac OS X 10.6.x 上工作。在 math.h 中声明的函数的 sources (例如:extern double pow ( double, double ); )没有随安装一起提供(至少我找不到它)。您可能会在您的系统/SDK 的 C 库中找到这些源代码。就我而言,数学库 (libm) 是一个单独的项目,它的一些源代码由 Apple 提供:http://www.opensource.apple.com/tarballs/Libm/Libm-315.tar.gz

    pow 的函数声明中的 extern 关键字意味着它是在其他地方定义的。数学函数是低级高性能实现,主要以汇编代码 (*.s) 完成。汇编例程(通过寄存器/堆栈获取参数/提供参数)与 C 库的其余部分链接。函数/例程名称的链接/导出是特定于平台的,如果目标不是深入汇编编码,这并不重要。

    我希望这会有所帮助, 拉斐尔

    【讨论】:

      【解决方案5】:

      如果您正在寻找计算是如何实现的,您可以在这里找到: http://fossies.org/dox/gcc-4.5.3/e__pow_8c_source.html 函数的名称是 __ieee754_pow 由 pow 函数调用。

      【讨论】:

        【解决方案6】:

        我真的是在math.h 中定义的。您是否尝试过包含math.h 并简单地使用pow? “找不到”是什么意思?

        【讨论】:

        • 是的,我可以使用它,但找不到它的声明。有人可以在 math.h 中找到它的声明和实现吗?请张贴在这里。谢谢。
        • 例如isless函数声明为: # ifndef isless #define isless(x, y) \ (extension \ ({ __typeof__(x) __x = (x) ; __typeof__(y) __y = (y); \ !isunordered (__x, __y) && __x
        【解决方案7】:

        这是 fdlibm 的 C 实现:http://www.netlib.org/fdlibm/e_pow.c

        对于它的价值,当 v8 删除它的 cos/sine 表时,它从 fdlibm 的实现中拉出来这样做:https://code.google.com/p/v8/source/detail?r=22918

        来自更改提交 cmets:“使用 fdlibm 端口实现三角函数。”

        另一方面,Mozilla 调用 cstdlib 数学函数,这些函数的性能会因构建和系统而异(例如:可能会或可能不会调用超越函数的芯片级实现)。虽然 C# 字节码似乎在可能的情况下明确引用了芯片级函数。但是,“pow”不是其中之一,iirc(似乎没有芯片级功能)并且在其他地方实现。

        另见:https://bugzilla.mozilla.org/show_bug.cgi?id=967709

        对于 Mozilla 社区中的余弦/正弦讨论,比较 Mozilla 的实现与旧的 v8 实现。

        另请参阅:How is Math.Pow() implemented in .NET Framework?

        内在函数是芯片级的,实际上是在处理器上实现的。 (我们不再需要查找表了。)

        【讨论】:

          【解决方案8】:

          它的herehere。 也继续wikipedia

          你会在那里找到 pow。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-07-22
            • 2012-03-22
            • 2022-01-03
            • 1970-01-01
            • 1970-01-01
            • 2011-05-17
            • 2011-11-09
            相关资源
            最近更新 更多