基本情報処理では「nという数字は二進数で何桁必要か?」などという問いが出てくることがある。

例えば1,000くらいなら、次のように数え上げることも可能だ。
2, 4, 8, 16, 32, 64, 128, 256, 512, 1024
と数えて、二進数で10桁、と分かる。あれ、1から数えないの?ごもっとも。ここで数えたのは「表現できるパターンの数」である。
1桁    2パターン 0 と 1 十進法だと 0~1
2桁    4パターン 00,01,10,11 十進法だと 0~3
という具合である。


しかし、これで「世界の人口が100億人まで増えたときを想定し、その値を確保するのに必要なビット数は」などとなると泣けてくる。
こういうときに対数関数を使う。ビット数、つまり、二進数で何桁になるか、を問われているので、対数関数の底は 2 である。
log210000000000 = log21010 = 10 × log210
※なぜこれがイコールで結ばれるかはこちら

ここで行き詰ってしまう・・のではなく、たいていは「log210 = 何某として計算しなはれ」と書かれている。確か3.106くらいだったかな。というのも、2を何乗すれば10になるか、ってのがlog210 という式の意味だ。 ってことは
log28 < log210 < log216  

3 < log210 < 4
ってことなので、とにかく、3~4の間である。ここでは3.106として、考えるとして、

10 × log210 = 10 × 3.106 = 31.06
※なぜこれがイコールで結ばれるかはこちら
で、10の1乗は10、で2桁取る。つまり、乗数に+1を加えた数が桁数なので 32.06 の端数を切り捨てて、32
※もし、途中の3.106の3.1の部分が間違っていたら、この答えも間違えていることになる・・・。

logの解の小数部を切り捨て、+1 すれば桁数。

こういう問題、とき方をちょっと知っているだけで確実な得点源になる。もう少し噛み砕け、という場合は、コメントなりいただけるとありがたい。ただし、こちらを理解している前提でのご質問をお願いしたい。もし、参照先で書いてあることが分からないのなら、そちらのページのコメントをお願いしたい。


logの話に混じったので、ちょっと別の観点でワークシート関数について触れてみよう。

Excelには、ワークシート関数とVBAとがある。人によって「関数」と言った場合、ワークシート関数なのかVBAなのか、違うことがある。「マクロ」についても然り。よって、このブログでは使う必要がない限りは「ワークシート関数」と「VBA」という表現で明確に区別している(つもりである)。

さて、VBAからワークシート関数を利用することができるのはご存知だろう。WorksheetFunctionとかいうのを使えばワークシートの関数を利用できる。

さて、ではどんなときに使えばいいのか。一般的には次の場合だろう。
・ワークシート関数にはあるが、VBAには存在しない関数。
  これは言うまでもないだろう。わざわざロジックを組むことなく実装できるのだから。
・ワークシート関数にもVBAにも同様の関数があるが、ワークシート関数の方が高機能である場合。
  log が良い例だが、VBAのlog関数は自然対数であるが、ワークシート関数は底も指定できる。常用対数とか使うなら断然ワークシート関数を使った方がいいだろう。

なお、同等の機能でも、ワークシート関数のほうがVBAの関数よりも高速、という話を聞いたことがある。実験をしていないので確証はないが、気が向いたら実験してみて欲しい。(私もそのうちに・・)

対数関数であるlog、事務計算ではローン関連くらいでしか聞かないが、いわゆる科学技術計算ではよく用いられるようだ。
情報処理でもちょいちょいでてくるので、おさらいの意味で記載しておく。

【加減算は内部では乗除算になる】
logx a + logx b = logx ( a × b )
logx a - logx b = logx ( a ÷ b )

補足だが、
log10 10 = 1
log10 100 = 2
log10 1000 = 3
である。

上記の補足を参考に、実際に値を入れて検証してみよう。例として加算を検証してみる。
log10 100 + log1010 = log10 ( 100 × 10 )
それぞれを上記の補足を参考に置き換えると
2 + 1 = 3
となり、整合性は取れている。


【内部のべき乗は掛け算として出せる】
logx a b = b × logx a

これも値を入れて検証してみよう。
log10 10 3 = 3 × log10 10

左辺は
log10 10 3 = log10 1000 = 3
右辺は
3 × log10 10 = 3 × 1 = 3
ということで、これも整合性は取れている。



さて、VBAで対数関数のlogを使うときの注意点にも触れておこう。
他のバージョンを確認していないが、Excel 2002、つまり Office XP のバージョンであれば、log関数はVBAではなくワークシート関数をVBA内で用いた方がよい
log関数には底、というものがあるが、VBAでは数学の専門用語でいうところの自然対数(底がe、VBAのヘルプに依れば約 2.718282 とのこと)しか扱えないのだが、ワークシートは底も指定できる。底の変換という数学的テクニックもあるが、シンプルな実装にした方が間違いが少ないし、利用できるものは利用しよう。


--------------------------------------------
残り僅か。もうチェックした?ブログ交流会 7/10 品川にて開催