3

double sin(double x)eglibc-2.13 で正確にどのように実装されているかを追跡する必要があります。ソース コードをダウンロードしたところ、プラットフォーム固有の __sin 関数だけが意味をなしていました。それは私が /usr/lib/i386-linux-gnu/libm.a に持っているものの中心ですか?

sin() から __sin() につながるマクロ定義を追跡する方法は? 私が本当に必要としているのは、正確なコード (ファイル名と行で十分です) と、ビルド プロセスがどの実装を使用するかを推測する方法です。アーキテクチャの i386。

4

2 に答える 2

5

(e)glibc のビルド プロセスは黒魔術です。あなたはそれを理解しようとはしません。ただし、glibc はパブリック関数ごとに 1 つのファイルというコーディング スタイルに準拠しているため、一般に、ソース ツリーがあり、何らかの関数の実装を見つけたい場合、最も簡単な方法は次のとおりです。

$ find * -name '*function*' -print

functionもちろん、トップレベルから、関数の名前に置き換えます。

について具体的に言えばsin、数学関数の一般的な実装はmathディレクトリにあります。ただし、の一般的な定義sinないようです。次に注目するのはsysdepsです。一般的ではないものはすべてsysdepsにあり、特に、sysdeps/ieee754IEEE 754 浮動小数点仕様にある程度依存しているが、他のシステムに依存していないすべての数学関数が存在する場所です。このディレクトリはタイプ別に編成されsysdeps/ieee754/dbl-64ています。IEEE のすべての数学関数が含まれていますdouble。そしてここにsysdeps/ieee754/dbl-64/s_sin.c、探しているコードである があります。(これらすべてのファイルのe_s_k_などの接頭辞は、以前は何かを意味していましたが、AFAIKはもはやそうではありません。)

sin特定のプロセッサのアセンブリ言語での の実装があった場合sin.Ss_sin.Sそれはsysdeps. ただし、存在するようには見えません。

于 2012-10-31T01:19:35.367 に答える
1

答えではありませんが、ほんの少しの背景です:

sin()C コードでorを使用する場合cos()、ほぼ確実に、C ライブラリではなくコンパイラが実装を提供します。例として、 GCC が提供するビルトインのリストを見てください。リンクされたページには、C ライブラリが提供するバージョンではなく、組み込みが使用されるケースについても説明されています。

于 2012-10-31T22:31:55.920 に答える