2017年3月18日土曜日

JavaScript で計算する常用対数と〈ビット〉数

 コンピュータの起原とか、日本での開発秘話について読書していたときのことです。。
 田原総一朗著『日本コンピュータの黎明』の 124 ページに、次のように書いてありました。

無理は承知だ。しかし、チャレンジャーには、無理だ、などという贅沢は許されないんだよ
 これが池田敏雄の口ぐせだった。

 どっかで、耳にした、セリフの起原までもが、わかっちまったのでした。


 ところで、少し前に、〝常用対数に 10 の自然対数を掛け算すると自然対数になる〟と知って、さっそく、計算式を作って試みたのでした。「常用対数」は、「 10 を底とする対数」で、「自然対数」とは「(自然対数の底) e を底とする対数」であります。
 JavaScript を利用して計算してみたところ、少々の誤差は残るものの、その通りの結果を確認できました。
―― が、このところ〈エントロピー〉に関わる資料を読んでいて紛らわしいのは、
〝 2, e, 10 が底の場合には、底の省略が可能である〟という「対数」での取り決めであります。

log 2lb / log eln / log 10lg

という、簡単明瞭に区別できる ISO 規格の記号があるのに、なぜ、それがあまり使われないのでしょうか?
 専門家であれば、無論、底が何かは、書くまでもないことなのでしょうが。
 JIS 規格の記載には「常用対数」と「自然対数」に並んで「 2 進対数」などと言葉はあれども、どうやら〈ビット〉数を算出する lb にいたっては、JIS 規格では採用すら、されていないらしく……。
 わざわざ、日本ではそのひとつを除外する理由が、専門家でない身にはわかりかねます。

 それはそうと ――。
 JavaScript で、常用対数の計算を直接可能とする関数はないようなのですが、
 この度、とある本に〝 2 を底とする対数に 2 の自然対数を掛け算すると自然対数になる〟と書いてあったので、

   ln N = ln 2 × log 2 N
   ln N = ln 10 × log 10 N

ならば、

   log 2 N = lb N = ln N ÷ ln 2
   log 10 N = lg N = ln N ÷ ln 10

という割り算で、求めることができるのであれば。

 これも、さっそく試してみたところ、多少の誤差は残るものの、まったくもって、その通りの結果となりました。
 というわけで、この下のほうでリンクしている資料ページの末尾に、【計算例】として、見本をのっけておきました。
 JavaScript のコードは、ページ末尾の HTML の近辺に記載しておりますが、文字のスタイルやレイアウトなどは、別途スタイル・シートを読み込んだり、またヘッダー内にも少々書いております。

function init() {
var i;
// set Num
var Str = '<OPTION value=1 SELECTED>1</OPTION><OPTION value=2>2</OPTION><OPTION value=2.718281828459045>2.718281828459045</OPTION>';
for(i=3; i<11; i++) {
Str = Str + '<OPTION value=' + i + '>' + i + '</OPTION>';
}
Str += '<OPTION value=16>16</OPTION><OPTION value=32>32</OPTION><OPTION value=64>64</OPTION><OPTION value=100>100</OPTION>';
Str += '<OPTION value=128>128</OPTION><OPTION value=256>256</OPTION><OPTION value=512>512</OPTION><OPTION value=1000>1000</OPTION>';
Str += '<OPTION value=1024>1024</OPTION><OPTION value=2048>2048</OPTION><OPTION value=4096>4096</OPTION><OPTION value=8192>8192</OPTION>';
for(i=10000; i<100000000000; i*=10) {
Str = Str + '<OPTION value=' + i + '>' + i + '</OPTION>';
}
document.getElementById('sNum').innerHTML = '<SELECT NAME="selN" id="selN" onChange="logMath(this.value)">' + Str + '</SELECT>';
}
// ln Math
function logMath(target) {
document.getElementById('lnMath').value = Math.log(target);
document.getElementById('lbMath').innerHTML = Math.log(target) / Math.LN2;
document.getElementById('lgMath').innerHTML = Math.log(target) / Math.LN10;
}

コピーして、参考にしていただくことは可能なのですが、注意事項として、
BODY タグ内に、 onLoad="init()" 〉の記述をしないと、
数字の選択肢としての、オプション・ボックスが存在しなくなります。
ページ読み込み時の、組み込み機能を使っているというわけです。

便利なのは、選択ボックスに一度フォーカスがあえば、そのあとは、
カーソルキーの上下で動作して、数字がずずいと変わっていくところです。
デフォルトで、フォーカスをあわせておくことも、組み込み時に可能なので、
ご希望で、お試しください。


情報エントロピー Ⅰ: 情報化とエントロピー教化思想
http://theendoftakechan.web.fc2.com/sStage/entropy/information.html

0 件のコメント:

コメントを投稿