Hatena::ブログ(Diary)

プログラマはサイコロを振らない このページをアンテナに追加 RSSフィード

2008-08-06 (Wed)

任意の底を持つ対数を計算する方法

| 11:42 | 任意の底を持つ対数を計算する方法を含むブックマーク

多くのプログラミング言語では、任意の底を持つ対数を計算するために一工夫が必要だ。


PHP

PHPで任意の底の対数得るのは簡単だ。log関数を用いて次のように書く。第二引数を省略するとネイピア数(自然対数の底)eが底となる。

<?php
// 底が2、真数が10の対数値。
$value = log(10.0, 2.0);
?>

しかし、このように書ける言語は少ない。


Java

JavaではMath.logメソッドもしくはMath.log10メソッドを使う。前者は自然対数(底はネイピア数e)、後者は常用対数(底は10)の値を返す。しかし、任意の底について計算をするようなメソッドは用意されていない。そこで、数学で習った対数の底の変換公式*1を用いて任意の底を持つ対数を計算する。

f:id:Kappuccino:20080806112129g:image

対数の底の変換公式)


bは任意の底だ。この式を用いれば、任意の底を持つ対数も、自然対数や常用対数を用いて計算することができる。例えば、底が2で真数が10の対数自然対数で書き換えると次のようになる。

f:id:Kappuccino:20080806112130g:image


これをJavaで書くと次のようになる。

// 底が2、真数が10の対数値。
double value = Math.log(10.0) / Math.log(2.0);

JavaScript

JavaScriptでは次のようになる。Javaと同じだ。

// 底が2、真数が10の対数値。
var value = Math.log(10.0) / Math.log(2.0);

C

せっかくなのでCの場合も。

#include <math.h>

...

double value = log(10.0) / log(2.0);


Ruby

Rubyだと。

value = Math.log(10.0) / Math.log(2.0)

結論: 多くの言語では対数の底の変換公式を使う必要がある

こうして見ると、多くの言語では任意の底を持つ対数を計算するためのメソッドや関数が用意されていないようだ*2。その場合は、対数の底の変換公式を用いることで任意の底を持つ対数を計算できる

f:id:Kappuccino:20080806112129g:image

対数の底の変換公式(再掲))

*1:底の変換公式を習うのは高校の数II。

*2http://magicant.txt-nifty.com/main/2006/08/ln_log_log10.htmlを見る限り、PHPの他に任意を底を持つ対数を計算するためのメソッドや関数が用意されている言語には、DelphiPrologPythonなどがあるようだ。