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

时间:2009-11-09 08:18:21

标签: c function declare pow

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

有人知道这个函数声明的位置吗?它在C中实现了什么?

参考:

  

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

8 个答案:

答案 0 :(得分:9)

通常,<math.h>等包含文件将包含其他头文件,这些文件实际上声明了您希望在<math.h>中看到的函数。这个想法是程序在包含<math.h>时获得它所期望的内容,即使实际的函数定义在其他头文件中也是如此。

查找标准库函数的实现,例如pow()是另一回事。您必须将源代码挖掘到C标准运行时库并在那里找到实现。

答案 1 :(得分:4)

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

其“定义”位于c标准库分发的源代码中。一种这样的分布是eglibc。这可以在线浏览,也可以在源代码发布中浏览:

w_pow.c

math_private.h

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

答案 2 :(得分:3)

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

答案 3 :(得分:3)

系统/ SDK的include目录中

声明:(例如:/usr/include ;/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.2.sdk/usr/包括/架构/臂/ 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库的其余部分链接。函数/例程名称的链接/导出是特定于平台的,如果目标没有深入到汇编编码中,则无关紧要。

我希望这有帮助, 圣拉斐尔

答案 4 :(得分:1)

我在math.h中确实定义了。您是否尝试过math.h并使用pow? “你找不到它”是什么意思?

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

为了它的价值,当v8删除了它的cos / sine表时,它从fdlibm的实现中提取出来:https://code.google.com/p/v8/source/detail?r=22918

从更改提交注释:&#34;使用fdlibm端口实现三角函数。&#34;

另一方面,Mozilla调用cstdlib数学函数,它将通过构建和系统具有可变性能(例如:可能会或可能不会调用超越函数的芯片级实现)。虽然C#字节码似乎可以明确引用芯片级函数。然而,&#34; pow&#34;不是其中之一,iirc(似乎没有芯片级功能)并在其他地方实施。

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

对于Mozilla社区中的cos / sine讨论,比较Mozilla的实现与旧的v8实现。

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

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

答案 7 :(得分:0)

herehere。 同样继续wikipedia

你会在那里找到战俘。