Cの標準ライブラリで用意されているのは自然対数log()と常用対数log10()のみで、2を底とする対数が欲しければ自分で計算しなければならない。そんなふうに考えていた時期が俺にもありました。
それがC99で、そのものずばりlog2()が追加されていた。
#include <math.h>こいつを実行すると
#include <stdio.h>
int main(int argc, char *argv[]) {
double xs[] = {1, 2, 3, 4, 6, 8, 11, 16, 100, 128, 200, 256};
int i;
for (i = 0; i < sizeof(xs) / sizeof(double); i++) {
double y = log2(xs[i]);
printf("log2(%lf) = %lf\n", xs[i], y);
}
return 0;
}
log2(1.000000) = 0.000000こうなる。
log2(2.000000) = 1.000000
log2(3.000000) = 1.584963
log2(4.000000) = 2.000000
log2(6.000000) = 2.584963
log2(8.000000) = 3.000000
log2(11.000000) = 3.459432
log2(16.000000) = 4.000000
log2(100.000000) = 6.643856
log2(128.000000) = 7.000000
log2(200.000000) = 7.643856
log2(256.000000) = 8.000000
もっともlog2が欲しい場面の大半は、ある整数を表現するのに何ビット必要かを計算するときなので、シフトしながら桁数を数えれば済む。double log2(double)はオーバースペックかな。
…と思ったけど、最近(?)のCPUは整数から浮動小数点数への変換をハードウェアでやってくれるので、doubleにキャストして指数部を直接見た方が速いかもしれない。
0 件のコメント:
コメントを投稿