No.5ベストアンサー
- 回答日時:
> もし、上記サイトのe_log.cの内容を、通常のプログラム形式で表示(拝見)する方法はありますか?
ダウンロードして保存して、テキストエディタで開いてください。
その e_log.c はC言語のソースコードそのものです。
実際にコンパイルするには http://www.netlib.org/fdlibm/ にある一式が必要かもしれません(試していません)
中を見ると、 メインの部分は sqrt(2)/2 < 1+f < sqrt(2) のときの log(1+f) を精度よく近似するものです。
この範囲を越えるような x については、 x = 2^k *(1 +f) となる k を探して (1+f) の対数を計算し、その後、元のlog(x)になるように計算しています。
log(1000) なら、
log(1000)
→ log(2^10 * 0.9765625)
→ 10 * log(2) + log(0.9765625)
と変形してから、 log(0.9765625) を求めます。
学校で習ったかと思いますが、logには「底の変換」等いくつかの公式があります。
log_a(x) を直接計算できなくても、 これらの公式を使って「計算できる底、真数だけの式」( t + s・log_b(y) 等)に変形すれば計算できます。
これはFdLibm というライブラリでの1例であって「一般的にこのアルゴリズムが使われている」というわけではありません。
実際に、glibcでは別のアルゴリズムが使われているようです。
底や真数によってアルゴリズムを使い分ける場合もあるでしょう。
Visual C++での実装や IntelのCPUに組み込まれた実装は、アルゴリズムが公開されているわけではないので、何が使われているかわかりません。
正解が一つではないので、回答も曖昧にせざるをえません。
No.4
- 回答日時:
No.3
- 回答日時:
そういうのは実装依存で、一般的というのはありません。
例えば、GCCで使われているC標準ライブラリglibcは、ソースが公開されています
https://github.com/lattera/glibc
これを辿っていくと
・対数演算命令のあるFPUを搭載した環境では、その命令を使うようにアセンブリで書かれている
例) https://github.com/lattera/glibc/blob/master/sys …
・そうで無い場合は近似値を計算: ソースを見る限り、計算済みのテーブルを使って補間しているように見える。
例) https://github.com/lattera/glibc/blob/master/sys …
ということがわかります。
また、FdLibm というライブラリでは、アルゴリズムがコメントに書いてあります。
http://www.netlib.org/fdlibm/e_log.c
あと、これは一般的だと思いますが。
特定の範囲のx,yについてのlog_y(x) を求めることができれば、公式を使っていろんな値の対数を計算できます
// 底の変換とか、log x^n = n log x, log (xz) = log x + log z とか
No.2
- 回答日時:
今どきのPCだとCPU内蔵命令一発なので具体的な計算方法は分からないでしょうね。
何らかの事情で自前で計算するなら適当に範囲を限定して近似関数を使うのが良いでしょう。
ここで範囲の限定というのは例えば
1000=2^10*(1000/1024)なので、
log(1000)=10*log(2)+log(1000/1024)
となり、log(2)は特定の定数なのであらかじめ計算しておけばよく
log(1000/1024)は1000/1024が1に近いので、log(x)の近似計算はxが1に近いところだけできれば十分ということです。
実際には例えば3/4<=x<3/2になるように調整します。
ただし近似関数としてlogのテーラー展開は収束が遅い&収束範囲が狭いで実際の計算には使いにくいでしょう。単純なテーラー展開でなく有理関数型の展開式が有効です。
例えば下記PDFの8ページ目(文書内p.64)の(6.11)を使えば、上の範囲限定と併用して15項まで計算すれば倍精度浮動小数点の限界くらいまで計算できるでしょう。
# http://na-inet.jp/nasoft/chap06.pdf
なお単精度なら5項くらいで十分なので、どこまで計算するかは目的次第ですね。
No.1
- 回答日時:
昔ならともかく、昨今のCPU、すくなくとも、最近のWindowsが動作しているようなCPUなら、浮動小数点演算専用の回路(FPU)が入っています。
FPUには、対数計算する命令が入っています(少なくとも、最近のWindowsが動作しているようなインテル系のFPUなら)
FPU内での具体的な計算方法までは知りません。
ですが、ハードウエアであることを活用した手法が使われており、C++のプログラムにしたらかえって効率が悪くなるようなものもあるだろう、と想像できます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 統計学の問題について教えて下さい。高校数学 大学数学 5 2023/03/07 09:04
- その他(ソフトウェア) F-BASICで計算中の実行が中途で勝手に止まり、大変困っています。 2 2023/03/02 16:15
- 化学 化学が得意な方に質問です。この問題の正解を教えて欲しいです。 【問題1】Log Kowの記述について 1 2022/09/26 23:44
- 数学 極限の計算をお願いします。 {log(2x+3)}/{log(3x+1)} のx→∞の極限値の求め方 3 2022/08/03 20:58
- Excel(エクセル) Excel(エクセル)でフィルター抽出後、非表示の行を計算しないで、合計を算出する方法 【内容】 添 4 2023/01/30 17:17
- 統計学 統計検定2級を取ろうと勉強中なのですが分からないことがあったので質問させていただきます。 スタージェ 6 2023/01/01 23:02
- 労働相談 有給休暇使用時の賃金の計算方法について 5 2022/04/04 00:02
- 統計学 統計学、エクセルがわかりません!解答と詳しい解説をお願いします! (1)それぞれの地域別に記述統計量 9 2022/08/21 16:30
- その他(Microsoft Office) Excelで時間計算(負) 8 2023/02/26 05:47
- 数学 数学2で学ぶ対数のlogの計算に関しての質問です。 (log2-log3)-(log1-log2)= 4 2022/06/17 11:37
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
mod でうまく
-
めちゃきれい
-
VBAの再計算が反映されない件に...
-
排他的論理和 BCC(水平パリテ...
-
バッチファイルでウインドウを...
-
モジュラス103の計算とは何でし...
-
EXCELなどで「返す」という表現
-
変化させるセルが変化しない
-
60進数の四則計算
-
プログラムの質問
-
VBでReplace
-
数値計算の高速化 (cos, sin, exp)
-
C言語についてです。 再帰を使...
-
Javaを使った行列計算
-
C言語のプログラミングの問題で...
-
エクセルで特定のセルのみを任...
-
matlab計算での進捗状況を知りたい
-
CとFORTRANの計算速度はどちら...
-
matlabで計算終了
おすすめ情報
C++(又はjava)の場合は、具体的にどのように計算しているのでしょうか?
具体的にlog(1000)の場合に、または一般的にどのアルゴリズムで計算している
のでしょうか?
ここら辺に詳しい方の、ご回答をお願いします。
>そういうのは実装依存で、一般的というのはありません。
<---貴方は、上記のコメントを書かれましたが、貴方の回答の最後の部分で次のコメント
があります。
>あと、これは一般的だと思いますが。
.....
// 底の変換とか、log x^n = n log x, .....
<---つまり私の質問は、log(1000)でも、log(1000.9)でも、その解を得る
アルゴリズムについて質問したわけで、私はこれを一般的といいました。
相手に疑問を持たせるコメントはとうかな?
貴方の紹介された、http://www.netlib.org/fdlibm/e_log.c には、回答らしきものが書かれていますが、画面表示の関係でその内容を読取ることが出来ません。
もし、上記サイトのe_log.cの内容を、通常のプログラム形式で表示(拝見)する方法はありますか?
以上