C で数学ライブラリをリンクする必要があるのはなぜですか?

09 の関数 と 18 26 に実装があります (または 39 デフォルトで実行可能ファイルにリンクされます (あたかも 48 のように) が指定されています)。 56 とのこの自動リンクを避けるように GCC に指示できます。 または 69 オプション。

71 の数学関数 87 に実装があります (または 97 静的リンクの場合)、および 105 デフォルトではリンクされていません。この 112 には歴史的な理由があります /127 違いますが、どれもあまり説得力がありません.

興味深いことに、C++ ランタイム 132 144 が必要です 、したがって、GCC (157) で C++ プログラムをコンパイルする場合 )、自動的に 163 を取得します リンクされています。


C は古い言語であり、FPU は比較的最近の現象であることを思い出してください。私が最初に見たのは 8 ビット プロセッサでの C で、32 ビットの整数演算でさえ大変な作業でした。これらの実装の多くは、持っていません 浮動小数点数学ライブラリが利用可能!

最初の 68000 マシン (Mac、Atari ST、Amiga) でさえ、浮動小数点コプロセッサはしばしば高価なアドオンでした.

浮動小数点演算をすべて実行するには、かなり大きなライブラリが必要でした。そして、計算は遅くなるでしょう。したがって、フロートはめったに使用しませんでした。整数またはスケーリングされた整数ですべてを実行しようとしました。 math.h を含めなければならなかったとき、あなたは歯を食いしばりました。多くの場合、それを避けるために独自の近似値とルックアップ テーブルを作成します。

トレードオフは長い間存在していました。 「fastmath」などと呼ばれる競合する数学パッケージが存在することもありました。数学の最適解は?本当に正確だが遅いもの?不正確だが速い?三角関数用の大きなテーブル?ほとんどの実装が明らかになったのは、コプロセッサがコンピュータに搭載されることが保証されたときでした。今どこかにプログラマーがいて、組み込みチップに取り組んでいて、数学の問題を処理するために数学ライブラリを持ち込むかどうかを決定しようとしていると思います.

それが数学が標準ではなかった理由です .多くの、またはおそらくほとんどのプログラムは、単一の float を使用しませんでした。 FPU が常に存在し、float と double の操作が常に安価であった場合、「stdmath」があったことは間違いありません。


誰も修正しようとしないばかげた歴史的慣習のためです。 C と POSIX で必要なすべての関数を 1 つのライブラリ ファイルに統合すると、この質問が何度も繰り返されるのを回避できるだけでなく、動的リンク時にかなりの時間とメモリを節約できます。コード> リンクされたファイルには、それを見つけて見つけるためのファイルシステム操作と、その静的変数、再配置などのためのいくつかのページが必要です.

すべての関数が 1 つのライブラリと 184 にある実装 、 195200 など。オプションはすべて no-ops (または空の 217 へのリンク) ファイル) は完全に POSIX に準拠しており、確かに望ましいものです。

注:POSIX について話しているのは、C 自体がコンパイラーの呼び出し方法について何も指定していないためです。したがって、 227 を扱うことができます 適合動作のためにコンパイラを呼び出す必要がある実装固有の方法として。