記憶力が無い

プログラミングとランニングとカメラと何か

三角関数を自前実装してみる(後半)

blog.ttk1.net

いつか書いた記事の続き。

前回の記事のおさらい

  • 二分法で三角関数の実装はできた
  • しかし、Python の math モジュールの三角関数の速度には遠く及ばなかった
  • Python の math モジュールの三角関数はどう実装されてるんだろうか

Python の math モジュールの三角関数の実装を調べる

Python のリファレンス実装である cpython について見ていきます。

github.com

C のソースはほぼ読めないのですが、math モジュールはどうやら mathmodule.c に記述されているようです。

https://github.com/python/cpython/blob/6255296c5060973f1f1d46e2ecddcc827f33490c/Modules/mathmodule.c#L1219

cos はここで C から Python にラップされています。 肝心の C の cos がどこから来るかというと...

Python.h > pyport.h の順にヘッダーファイルをたどっていくと、pyport.h の中で 標準Cライブラリの math.h をインクルードしてました。

したがって、三角関数は標準Cライブラリのものが使われていると思われます。

標準Cライブラリの三角関数の実装について

今回は GNU Cライブラリ (glibc) について見ていきます。

※ 今回使用したバージョンは 2.32 です

www.gnu.org

glibc の math.h を見てみると、マクロがゴリゴリに使われていて私のような素人では解読するのは難しかったです。 色んなCPUアーキテクチャに対応するために、コンパイル時に適切なソースが使用されるようにしてるんだと思うのですが、読めない。。。

頑張って手でマクロを置換したりして、三角関数の実装がどこにあるか調べていくと、x86_64 アーキテクチャの場合 sin/cos の実装は sysdeps/ieee754/dbl-64/s_sin.c にあるものが使われるようになってるみたいでした。 ソース上のコメントから、どうやらテーラー展開を使って計算しているようです。

まとめ

  • cpython の math モジュールの三角関数は標準Cライブラリのものを使ってる
  • glibc では sin/cos はテーラー展開を使って実装されてる
  • glibc のソースを読むのはしんどい
Copyright © 2017 ttk1