2014年7月3日木曜日

C99のlog2()

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 件のコメント:

コメントを投稿