5

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

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

参考:

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

4

8 回答 8

9

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

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

于 2009-11-09T08:26:47.830 回答
4

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

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

w_pow.c

math_private.h

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

于 2009-11-09T12:42:19.417 回答
3

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

于 2009-11-09T14:55:40.007 回答
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) 是一个单独的项目,它的一些源代码由 Apple 提供:http ://www.opensource.apple.com/tarballs/Libm/Libm-315.tar.gz

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

我希望这有帮助,拉斐尔

于 2010-10-29T21:20:36.927 回答
2

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

于 2012-03-31T06:41:10.750 回答
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

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

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

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

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

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

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

于 2014-11-26T19:55:37.887 回答
1

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

于 2009-11-09T08:20:50.620 回答
0

在这里也在这里。也去维基百科

你会在那里找到 pow 。

于 2009-11-09T08:23:37.213 回答