- 締切済み
C言語 log実装
math.c に定義されている log関数の中身(実装)はどのようになっているのしょうか? 調べてみたのですが、 gccのライブラリだと __asm flogn%~ と良くわからいアスムコードが定義されていました。 また、logだとテイラー展開などややこしそうな内容が出てきたので 少しお手上げ状態です
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
ありがちパターンは「いくつかの点で計算しておいてあとは線形近似」ですけどね>#4. いずれにしても, 使っているプロセッサでどこまでの計算ができるのかがわからないとなんともいいがたいわけですが. その気になれば「整数演算しかできないプロセッサで浮動小数をシミュレート」なんてのもありますし. ... あぁ, 原理的には CORDIC も使えるか....
- salsberry
- ベストアンサー率69% (495/711)
標準ヘッダであるmath.hが使えないんですか。組込向けとかですかね。 CPU(FPU)の種類によっては対数を求める命令を実装していたりしますから、それを呼ぶという手があります。 logの引数に来る値が100通りくらいに決まっている場合は、他の環境で予め計算しておいた結果を表にしておく方法もあります。三角関数だとよく見かけますが対数関数だと引数を限定するのが難しそうです。
- salsberry
- ベストアンサー率69% (495/711)
何をするためにlog関数の実装を理解したいのでしょうか? アルゴリズムを勉強したいという目的なのか、それとも移植や改造をしたいのでしょうか。それによってどう回答すべきかが変わります。 質問者さんが見ているmath.cのことは回答者には分かりませんから、その内容を解説してもらいたいのであれば、どのソフトウェアに含まれている/どこからダウンロードしてきたmath.cなのか、またそのどこの部分が理解できないのかを書いてください。 gccのライブラリとmath.cの関係も不明です。 もしかしてmath.cではなくてmath.hのつもりでしょうか?
- jjk65536
- ベストアンサー率59% (66/111)
移植性の高いコードを書くにあたっては、まず仕様でどこまで定義されているか 知るべきです。 この場合はC言語のJIS規格であるX3010:2003(C99相当)を調べてみました。 すると、以下のようにあります。 > 機能 log関数群は、xのeを底とする(自然)対数を計算する。実引数が負の場合、 > 定義域エラーが発生する。実引数が0の場合、値域エラーが発生することがある。 > 返却値 log関数群は、logexの値を返す。 この文章から解釈されうるいかなる実装も存在すると仮定してコーディングすべきです。 回答としてはズレてると自覚していますが、ご質問されている「log関数の中身は どうなっているか?」より「どうなっていると保証されているか?」を確認するのが 重要であると言いたかったので。
お礼
調べていただきありがとうございます。 自力でのコーディングは自分では難しそうなので、 近似式などに仕様を置き換えてもらうなど、相談中です。
- Tacosan
- ベストアンサー率23% (3656/15482)
結果的に適切な値が得られればいいので, どのように計算しているのかは処理系に依存すると考えるべきでしょう. FPU の命令を直接実行するかもしれんし, ものによってはテイラー展開したりパデ近似するかもしれん. そもそも math.c って何だってところからはじまるけど.
お礼
指摘ありがとうございます。 math.c × math.h ○ です。 数学智識に乏しいので、すぐには難しそうですね。
お礼
指摘ありがとうございます。 math.c × math.hの事です。 logの計算式が入った仕事が最近来ました。 math.hが使えない開発環境のため、 コードを移植できないかと思っています。