3


1

pow関数はCのどこで定義され実装されていますか?

pow(double、double)関数は "math.h"で定義されていると読みましたが、その宣言が見つかりません。

この関数がどこで宣言されているのか誰かが知っていますか? そしてそれはCのどこで実装されていますか?

参照:

8 Answer


9


多くの場合、 のようなインクルードファイルには、 で見ることが期待される関数を実際に宣言する他のヘッダファイルが含まれます。 実際の関数定義が他のヘッダファイルにある場合でも、プログラムはそれが ``を含むときに期待通りの結果を得ることができます。

`pow()`のような標準ライブラリ関数の実装を見つけることは全く別の問題です。 あなたは、あなたのC標準のランタイムライブラリにソースコードを掘り下げて、そこに実装を見つける必要があるでしょう。


4


定義されている場所は環境によって異なります。 コードはどこかにコンパイルされたC標準ライブラリの中にあります。

その "定義"はあなたのC標準ライブラリ配布のソースコードにあります。 そのようなディストリビューションの1つがeglibcです。 これはオンラインまたはソース配布物で閲覧可能です。

短い答え:C標準ライブラリのソースコードの中です。


3


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)

定義済み(実装済み):

  • library(コンパイル済み、バイナリコード)として:システム/ SDKのライブラリディレクトリ(例:/ usr / lib(数学ライブラリの場合はlibm.dylib)

  • ソース(プログラムコード)として:これは興味深い部分です。 私は今Mac OS X 10.6.xで作業しています。 math.hで宣言されている関数の_sources_(例:extern double pow(double、double);)はインストールに同梱されていません(少なくとも私はそれを見つけることができませんでした)。 あなたはあなたのシステム/ SDKのCライブラリでそれらのソースを見つける可能性があります。 私の場合、数学ライブラリ(libm)は独立したプロジェクトです。そのソースのいくつかはAppleによって提供されています。

powの関数宣言の中のexternキーワードは、他の場所で定義されていることを意味します。 数学関数は、大部分がアセンブリコード(* .s)で行われる低レベルで高性能な実装です。 アセンブリルーチン(引数を取る/レジスタ/スタックを介してパラメータを渡す)は、Cライブラリの他の部分とリンクされています。 関数/ルーチン名のリンク/エクスポートはプラットフォームに固有のものであり、その目的がアセンブリコーディングに取り込まれていなくても、実際には関係ありません。

これが助けになれば幸いです、ラファエル


1


私は本当に math.h`で定義されています。 `math.h`をインクルードし、単に pow`を使ってみましたか? 「見つからない」とはどういう意味ですか?


1


計算の実装方法をお探しの場合は、ここで見つけることができます。http://fossies.org/dox/gcc-4.5.3/epow_8c_source.htmlこの関数の名前はpow関数によって呼び出されるieee754_powです。


1


これがfdlibmのC実装です。http://www.netlib.org/fdlibm/e_pow.c

価値のあることに、v8がそのcos / sineテーブルを削除したとき、fdlibmの実装から削除しました。

変更コミットのコメントから、「fdlibmポートを使用して三角関数を実装する」。

一方、Mozillaはcstdlib数学関数を呼び出します。これは、ビルドやシステムによってパフォーマンスが変わります(例:チップレベルの超越関数の実装を起動する場合と起動しない場合があります)。 C#バイトコードは可能であればチップレベル関数を明示的に参照しているようです。 しかし、「pow」はそのうちの1つではなく、iirc(チップレベルの機能を持っていないようです)で、他の場所で実装されています。

Mozillaコミュニティでの余計な議論については、Mozillaの実装と古いv8の実装の比較。

https://stackoverflow.com/questions/8870442/how-is-math-pow-implemented-in-net-framework[Math.Pow()は.NET Frameworkにどのように実装されていますか。

組み込み関数はチップレベルであり、実際にはプロセッサ上に実装されています。 (必ずしもルックアップテーブルはもう必要ありません。)


0


その こちらおよび こちら wikipediaにも行きます

あなたはそこに力を見つけるでしょう。