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

vwkv1x7d  于 2023-10-16  发布在  其他
关注(0)|答案(9)|浏览(145)

我读到pow(double,double)函数在“math.h”中定义,但我找不到它的声明。
有人知道这个函数在哪里声明吗?它在C中是在哪里实现的?
参考文件:
http://publications.gbdirect.co.uk/c_book/chapter9/maths_functions.html

xa9qqrwz

xa9qqrwz1#

通常,像<math.h>这样的包含文件会包含其他头文件,这些头文件实际上声明了您希望在<math.h>中看到的函数。这个想法是,当程序包含<math.h>时,它会得到它所期望的,即使实际的函数定义在其他头文件中。
找到标准库函数(如pow())的 * 实现 * 则完全是另一回事。你必须把源代码挖掘到你的C标准运行时库中,并在那里找到实现。

q43xntqr

q43xntqr2#

它的定义位置取决于您的环境。代码在某个编译的C标准库中。
它的“定义”在你的c标准库发行版的源代码中。eglibc就是这样一个发行版。这是可以在线浏览的,或者在源发行版中:
w_pow.c
math_private.h
简短回答:在C标准库中的源代码.

clj7thdc

clj7thdc3#

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

kgqe7b3p

kgqe7b3p4#

**声明:**在您的系统/SDK的include目录中(例如:/usr/include;/Pinteroper/Platforms/iPhoneOS.platform/Pinteroper/SDKs/iPhoneOS3.2.sdk/usr/include/architecture/arm/math.h)
已定义(已实现):

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

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

olmpazwi

olmpazwi5#

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

wn9m85ua

wn9m85ua6#

我真的在math.h中定义了。您是否尝试过包含math.h并仅使用pow?什么叫“找不到”?

fcy6dtqo

fcy6dtqo7#

下面是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社区中的cos/sine讨论,Mozilla的实现与旧的v8实现的比较。
标签:How is Math.Pow() implemented in .NET Framework?
内在功能是芯片级的,实际上是在处理器上实现的。(我们不再需要查找表。)

w6lpcovy

w6lpcovy8#

它的herehere。也可以访问wikipedia
你会在那里找到战俘。

l0oc07j2

l0oc07j29#

这是一个powq在GNU gcc-13中的实现。
实现的核心思想在代码的顶部:

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编译器只为它们做了一个别名。

相关问题