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 に答える
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 に答える
3

の実際の実装はpow、コンパイラによって異なる場合があります。通常、math.h (または math.h に含まれるベンダー固有のファイル) はプロトタイプ(つまり、その宣言)を提供しますpowが、実装は libm.a などの一部のライブラリ ファイルに埋もれています。コンパイラによっては、powまたはその他のライブラリ関数の実際のソース コードが利用できない場合があります。

于 2009-11-09T14:55:40.007 に答える
2

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

于 2012-03-31T06:41:10.750 に答える
1

私は本当にで定義されていmath.hます。含めmath.hて単純に使用してみましたpowか?「見つからない」とはどういう意味ですか?

于 2009-11-09T08:20:50.620 に答える
0

そのこことまたここウィキペディアにも行く

そこに捕虜がいます。

于 2009-11-09T08:23:37.213 に答える