数学の対数関数(log)を復習したのでメモ

/**
 * 必要な桁数まで0を埋める。
 * @param number 桁数
 * @param size 桁数
 */
function fillZero( number, size ) {
  if ( number < 0 ) throw "illegal argument.";
  var s = number != 0 ? Math.log( number ) * Math.LOG10E : 0;
  for( i=1,n=size-s,str="";i<n;i++ ) str += "0";
  return str+number;
}
数値の先頭に0を追加して桁をあわせる関数がバグっていたので修正。 - うなの日記

これを理解する為に、今はすっかり忘れた高校数学を思い出さないといけませんでした。
また忘れた時に思い出せるように、メモしておきます。
logなんて社会にでたらつかわねーよとか思っていた時期が自分にもありました・・・

常用対数を使った桁の求め方

10^2 &lt; 100 &lt; 10^3
\log _{10} 10^2 &lt; \log _{10} 100 &lt; \log _{10} 10^3
2 &lt; \log _{10} 100 &lt; 3

という事で、桁を調べたい数の常用対数の、小数点以下を切り上げた数値が、桁数になります。

Javascriptの対数関数

しかし、JavascriptのMath.log()は、下記の様に自然対数を返すメソッドです。
Math.log(3) : \log _e 3


逆に、Math.log( number )に掛けられているMath.LOG10Eは、下記の様にeの常用対数です。*1
Math.LOG10E : \log _{10} e

つまるところ

細かくは忘れましたが、これが成り立ちます。
\log _e y \times \log _{10} e = \log _{10} y

var s = Math.log(y) * Math.LOG10E;

つまりvar sにはyの常用対数が代入されます。


念のため、Google電卓で確認してみました。
http://www.google.com/search?q=ln2*log%28e%29
http://www.google.com/search?q=log2

少し修正*2

/**
 * 必要な桁数まで0を埋める。
 * @param number 桁数
 * @param size 桁数
 */
function zerofill( number, size ) {
    if ( number < 0 ) throw "illegal argument.";
    var s = number != 0 ? Math.log( number ) * Math.LOG10E : 0;
    var i, str;
    for( i=1,n=size-s,str="";i<n;i++ ) str += "0";
    return str+number;
}

ゼロフィルしたくて使ってたら、istrがグローバルを汚染してたので、ちょっとだけ修正しました。ついでに関数名とインデントを自分の好みに合わせたり。

*1:ただし、メソッドでは無くプロパティです。

*2:2011/03/24