2009-11-09 145 views
3

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

有没有人知道这个函数在哪里声明?它在C中实现的地方是什么?

参考:

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

+0

如果它不是直接在'math.h'中,只要标记包含,具有标记功能(或类似功能)的体面编辑器就会将您带到声明的正确位置文件目录为您的C运行时库。几乎任何像样的编程编辑器都会拥有这种能力。 – 2009-11-09 08:32:11

+0

我不知道你使用的是什么编译器,但是它看起来像MSVC 9,不包括'pow()'的源代码。这个实现似乎在一个没有包含源文件的'tran.lib'库中。 – 2009-11-09 08:53:13

回答

1

math.h是真正定义。你有没有试过包括math.h,并简单地使用pow? “无法找到它”是什么意思?

+1

是的,我可以使用它,但无法找到它的声明。有人可以在math.h中找到它的声明和实现吗?请在这里发布。谢谢。 – root 2009-11-09 08:26:45

+0

例如,isless函数被声明为: 的#ifndef isless #限定isless(X,Y)\ (__extension__ \t \t \t \t \t \t \t \ ({__typeof __(x)的__X =(X); __typeof __( Y)__y =(Y);!\t \t \t \ isunordered(__X,__y)&& __X <__y;})) #ENDIF 我希望这种情况发生战俘类似的事情(双,双) – root 2009-11-09 08:28:04

9

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

查找执行的标准库函数,如pow()是另一回事。您将不得不将源代码挖掘到C标准运行时库并在其中找到实现。

+1

注意,最编译器确实为图书馆提供了资源。但它有时可能是一个迷宫。 – 2009-11-09 08:34:04

4

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

它的“定义”在你的c标准库发行版的源代码中。 eglibc就是这样一种分布。这是可浏览网上,或者在源分布:

w_pow.c

math_private.h

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

+1

很多难以阅读的代码。 :) – pbos 2009-11-09 12:44:21

2

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

3

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

定义(实现):

  • (编译二进制代码):在您的系统/ SDK的库目录(如:/ usr/lib(如果数学库是libm.dylib)
  • 作为源代码(程序代码):这是有趣的部分。我现在在Mac OS X 10.6.x上工作。对于在math.h中声明的函数(例如:extern double pow(double,double);),来源未与安装一起发货(至少我找不到它)。您可能会在系统/ SDK的C库中找到这些源代码。在我的情况下,数学库(libm中)是一个独立的项目,它的一些源是由苹果公司提供:http://www.opensource.apple.com/tarballs/Libm/Libm-315.tar.gz

在战俘手段函数声明extern关键字,那它的定义在别处。数学函数是大多数以汇编代码(* .s)完成的低级高性能实现。汇编例程(通过寄存器/堆栈获取参数/给出参数)与C库的其余部分链接。链接/导出函数/例程名称是特定于平台的,并且如果某个目标不适用于汇编代码,则无关紧要。

我希望这有助于, 拉斐尔

1

下面是fdlibm C实现:http://www.netlib.org/fdlibm/e_pow.c

对于它的价值,当V8放弃了COS /正弦表,它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的执行VS老V8执行的比较。

参见:How is Math.Pow() implemented in .NET Framework?

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

相关问题