2009-11-09 142 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?

內在功能是芯片級,在處理器上實際實現。 (我們不一定需要查找表。)

相關問題