はsqrt()
、sin()
、cos()
、tan()
、log()
、exp()
(これらのmath.h/cmath)から入手できるような関数のいずれかの定義がありますか?定義
私はちょうど彼らがどのように動作するのか知りたいと思っていました。
はsqrt()
、sin()
、cos()
、tan()
、log()
、exp()
(これらのmath.h/cmath)から入手できるような関数のいずれかの定義がありますか?定義
私はちょうど彼らがどのように動作するのか知りたいと思っていました。
これは興味深い質問ですが、効率的なライブラリのソースを読むことは、使用する方法を知っていない限り、あなたをあまり遠ざけません。
古典的な方法を理解するのに役立ついくつかの例を示します。私の情報は決して正確ではありません。以下のメソッドは古典的なメソッドだけですが、特定の実装では他のメソッドを使用できます。
sincos
関数を提供しない理由を疑問に思っています。atan2
は、sincos
と少しロジックを呼び出して計算されます。これらの関数は、複素数演算のビルディングブロックです。+1実際に数学を説明してください。私はtrig関数が単なるTaylor級数の拡張であることを実感したときにはずっと良くなっていました。さもなければ近似は深刻な魔法のように見える!数値方法の場合は –
+1です。 – birryree
@Ben:一般的に、良いライブラリは切り捨てられたテイラー級数を使用しません。他の多項式近似(Minimax、Chebyshev、Padé)は、より望ましい誤差特性を持ち、少ない演算処理で同じ精度を得ることができます。 –
これらはほとんど常にシステムコールとして実装されています。ソースを見るには、OSソースにアクセスする必要があります。つまり、LinuxやBSDのようなオープンソースのOSを見る必要があります。
「罪」をシステムコールとして?問題のOSが非常にグラフィカルでない限り、それはカーネル空間を無駄にしてしまいます。コンテキスト切り替えのためにRTLの実装よりも遅くなります。 sin、cosなどを計算することができる*命令*がありますが、システムコールはありますか?疑わしい。 – cHao
ほとんどありません。関数は、通常のC呼び出しであり、コンパイラまたはCライブラリによって提供されます。 FPUのないシステムの場合、これらの関数が使用する命令はOSによってトラップされ、エミュレートされる可能性がありますが、これはまれなケースです。 – wnoise
数学関数はシステムコールとして実装されていますか?本当に?? –
すべての実装は異なる場合がありますが、glibc(GNU Cライブラリ)のソースコードから1つの実装をチェックアウトすることができます。
編集:Googleコード検索がオフラインになっているため、古いリンクはどこにもありません。
のglibcの数学ライブラリのソースがここにあります:
おかげで興味深いリンクがあります。 :-) – Nawaz
リンクが壊れています... – unkulunkulu
@unkulunkulu - glibcのgit repoへの直接リンクで更新されました。 – birryree
具体的にはfdlibmソースをご覧ください。 fdlibmライブラリは自己完結型であり、各関数には数学の詳細な説明が書かれており、コードは非常に読みやすくなっています。
+1推奨fdlibm –
数学のコードをよく見れば、glibcを見るのはお勧めできません。コードはしばしば非常に難しく、glibcの魔法に多く依存しています。 math lib in FreeBSDは、何らかの理由で時には速度が遅くなっても、はるかに読み易くなります(多くはそうではありません)。
複雑な関数の場合、実際の関数では正確なnan/inf/0の扱いはすでに困難ですが、複雑な関数にとっては悪夢です。 C99規格は多くのコーナーケースを定義し、一部のファンクションは10-20コーナーケースを容易にします。あなたは最新のC99 standard documentの別館Gを見てアイデアを得ることができます。そのフォーマットが標準化されていないので、長い倍精度でも難しいです - 私の経験では、長い倍精度のバグがかなりあるはずです。うまくいけば、拡張精度を備えたIEEE754の今後の改訂版は状況を改善するだろう。
コーナーケースについての良い点。いくつかのケースでは簡単にボトルネックになることがあります(MSVCでの 'ldexp'の実装は、関数をかなり役に立たなくします) –
ほとんどの最新のハードウェアには、これらの機能を非常に効率的に実装する浮動小数点ユニットが含まれています。
fdlibmはすべてのものの実装を提供し、オープンソースであり、スタンドアロンであり、かなり読みやすいです。彼らはまともなパフォーマンスを提供するように設計されているため、最も単純な実装ではありません。 –
[Cはsin()やその他の数学関数をどのように計算するのですか?](http://stackoverflow.com/questions/2284860/how-does-c-compute-sin-and-other-math-functions) –