プログラム上でlog(底はe)の計算を擬似的に行う方法はありますか?
精度は高くなくてよく,速度を重視した方法がいいです.
普通にcなどにあるlogの関数を使うよりも低い精度でいいので早い方法が知りたいです.
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/26 06:58
2021/05/26 07:04 編集
回答4件
0
遅くなりましたが、Fast log2のテストをしてみました。
誤差はまあまあですが、おそらく標準のlog2よりは遅いでしょう。
ソースは以下です。
C
1$ cat log2.c 2#include <stdio.h> 3#include <stdlib.h> 4#include <math.h> 5 6#define FRACTION (23) 7#define EXPONENTMASK (0xFF) 8#define BIAS (127) 9 10float fast_log2 (float val) 11{ 12 int *exp_ptr = (int *)&val; 13 int x = *exp_ptr; 14 int log_2 = ((x >> FRACTION) & EXPONENTMASK) - (BIAS + 1); 15 x &= ~(EXPONENTMASK << FRACTION); 16 x += BIAS << FRACTION; 17 *exp_ptr = x; 18 val = ((-1.0f/3) * val + 2) * val - 2.0f/3; 19 return (val + log_2); 20} 21 22int main(void) { 23 float f; 24 25 f = 1.0; 26 printf("%f fast_log2: %15.15f\n", f, fast_log2(f)); 27 f = 2.0; 28 printf("%f fast_log2: %15.15f\n", f, fast_log2(f)); 29 f = 3.0; 30 printf("%f fast_log2: %15.15f\n", f, fast_log2(f)); 31 printf("%f math log2: %15.15f\n", f, fast_log2(f)); 32 f = 0.1; 33 printf("%f fast_log2: %15.15f\n", f, fast_log2(f)); 34 printf("%f math log2: %15.15f\n", f, log2(f)); 35}
実行結果
shell
1$ ./log2 21.000000 fast_log2: -0.000000059604645 32.000000 fast_log2: 0.999999940395355 43.000000 fast_log2: 1.583333253860474 53.000000 math log2: 1.583333253860474 60.100000 fast_log2: -3.319999933242798 70.100000 math log2: -3.321928073389531
投稿2021/05/27 23:48
総合スコア24670
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/28 13:45
0
ベストアンサー
投稿2021/05/26 07:51
総合スコア5686
0
frexp
を使って0.5<x<=1の範囲に持ち込んで(指数分はln(2)
の定数を用意しておいて調整)、ln(1+x)
のマクローリン展開を途中で打ち切る、ような流れが考えられます。
ただし、ライブラリは徹底的にチューニングされていることも多いです。自分で書いて勝てるかは、実験してみないとわかりません。
投稿2021/05/26 07:24
総合スコア146018
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ググっただけですが、こんなのを見つけました
投稿2021/05/26 06:56
退会済みユーザー
総合スコア0
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。