C 语言中的 pow 函数在哪里定义和实现?

问题描述 投票:0回答:9

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

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

参考:

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

c function declare pow
9个回答
9
投票

通常,诸如

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

找到标准库函数(例如pow())的

实现
是另一回事。您必须将源代码挖掘到 C 标准运行时库并在那里找到实现。


4
投票

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

它的“定义”位于您的 c 标准库发行版的源代码中。此类发行版之一是eglibc。这可以在线浏览,或者在源代码分发中:

w_pow.c

math_private.h

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


3
投票

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


3
投票

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

定义(实现):

  • as library(编译后的二进制代码):在系统/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 库的其余部分链接。函数/例程名称的链接/导出是特定于平台的,如果目标不是深入汇编编码,则并不重要。

我希望这有帮助, 拉斐尔


2
投票

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


1
投票

我确实在

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


1
投票

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

值得一提的是,当 v8 删除其余弦/正弦表时,它是从 fdlibm 的实现中提取出来的:https://code.google.com/p/v8/source/detail?r=22918

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

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

另请参阅:https://bugzilla.mozilla.org/show_bug.cgi?id=967709

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

另请参阅:Math.Pow() 在 .NET Framework 中是如何实现的?

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


0
投票

这里,也是这里。 也请继续维基百科

你会在那里找到战俘。


0
投票

这是 GNU gcc-13 中 powq 的实现。

该实现的核心思想位于代码顶部:

 powq(x,y) return x**y

              n
 Method:  Let x =  2   * (1+f)
    1. Compute and return log2(x) in two pieces:
        log2(x) = w1 + w2,
       where w1 has 113-53 = 60 bit trailing zeros.
    2. Perform y*log2(x) = n+y' by simulating muti-precision
       arithmetic, where |y'|<=0.5.
    3. Return x**y = 2**n*exp(y'*log2)

注意到我们更常用的

pow
是通过硬件实现的或者
libm
,C编译器只是为它们起了一个别名。

© www.soinside.com 2019 - 2024. All rights reserved.