TOP > プログラマ2.0日報 > 灰色の唄を歌おう...(前編)

あすなろBlogger

facebookに投稿 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク このエントリーをはてなブックマークに追加 この記事をクリップ! livedoorclip ユーザー数 BuzzurlにブックマークBuzzurlにブックマーク この記事をtweetする

灰色の唄を歌おう...(前編)

2009.02.13

別に悲観的な内容じゃ全然ないですよ(苦笑)

コンピュータでの「数値表現」は二進数が一般的だ、というのは世間一般での大常識です。とはいえ、昔のコンピュータだと、実は「二進数と言われても?」となるタイプのアーキテクチャがあったのをご存知ですか?(別に実験的なマシンじゃなくて、の話です)

それはですね、IBM1401 という60年代の大ベストセラーマシンですけども、これいわゆる「二進化十進数」(プログラマはBCDという言い方の方が馴染んでます)のアーキテクチャなのですね。このマシンでは(仮にCで書くと....)

int x = 9;
int *p = &x;
(*p)++;
printf( "0x%02x", *p );

は、0x0a ではなくて、0x10 になります(%x が数値的値ではなくて、ビットパターンを表示するとしての模式的な話、ですから真に受けないでね!)。言い換えると、

値を 4bit 単位で使って、それを十進数の1桁として扱う。だから、0x00(0)~0x09(9) は使われるが、0x0a~0x0f の範囲は数値表現としてはまったく使われない。

という「ビットの使い方」がBCDなのです。要するに、

COBOL の数値

と同じで、数値は「固定小数点で両方へ最大の桁数」というフォーマット情報を属性みたいに持って、その桁数の範囲だったら絶対に丸め誤差が発生しない...というものですから、金額計算メインのビジネス用コンピュータでは大きなメリットがあるわけですね。

まああと、7セグLED を点灯するのに、数値表現がBCDだと都合がいいために、LED 表示器が直接 BCD を受けるとか、相互に変換をする汎用ロジックICとか、結構使われるところでは使われる

ビットレベルでの数値の表現

なんですね(まあ負の数の表現法...となるとさらに複雑ですけどね...今回は正の数限定の話です。ちなみに Intel CPU ではインストラクションセットに AAA とかAAD とか AAM とか DAAとか、計算後の値を BCD に補正する命令が今でもあったりします....起源の古い DAA だと 8080 の昔からずっと、ね)。

なんでこんな話をしているか、というと、

コンピュータの中の「自然(ピュシス)」と「慣習(ノモス)」

という大問題の前フリだからです。言い換えると、

コンピュータの技術の中で、恣意的・人為的に決まっている約束事ではなくて、それ自体に意味がある『自然』はあるのか?

という哲学的(ごめん)疑問です。二進数表現でさえ、その表現形が観念上の数としてどれを表すか、という面では

それは約束事なので、それによる....

としか言いようがない世界なのです。ですから、二進数表現ではもっとヘンな、しかし使われるからには合理的な数値表現もあるのです。グレイコードといいましてね、

000(0) 001(1) 011(2) 010(3) 110(4) 111(5) 101(6) 100(7)

が3bit の場合の「グレイコードbit表現(数)」の対応になります。これ、一体何の役に立つのか...というと、実は

グレイコードは、隣り合う数値同士で、1bit づつしか相互に違わない数値のエンコーディング

なのです。一般の二進表現では、

011(3) の次は 100(4) だ

と、数字が1変わるだけなのに、3bit 変わる必要がこの場合あるわけです。このとき、

あれ?コンピュータは間違って 011 → (111) → (110) → 100 と変わる(変化の経路はテキトー)の間で、間違った値を拾っちゃいはしないか???

と悩んだことはありませんか(たとえばスレッドとか割り込み処理とかで...苦笑)? 実はコンピュータの内部(バスで接続されている)に限っては、クロックによる同期がちゃんと行われているので、そういうことはありえない(あったらハード的故障)し、また変化の遅いポートの読み出しなどは、

別なポート(READYとかそういう名前のピン)が変化した後は、そのポートの値が信用できる

という約束でビジーウェイトしながら読み出しをすることも結構ある(デバドラの初期化ルーチンなんてこんな感じのロジック多いですね)わけで、

タイミングによる読み間違いはないはず

なのです。しかし、

連続的に値を読み出し可能なデバイス、たとえば外付けで接続するデジタル温度センサ

だと、一番外側の現実世界に直接接続する界面(インターフェイス)では、クロックによるタイミングなどというものは無効になってしまうのです。ですから、そこでは「連続的に変化する数値を、離散的な値へ変換する」ことをクロックによるタイミングの助けなしにしなければならなくなります....値をいつどんなタイミングで読んでもいいのならば、最小変化幅が 1bit しかありえない、擬似連続な離散コードであるグレイコードを使うメリットが生まれるのですね。

というわけで、

ビットパターンを見て、それが何を示すのか?

と言われても、それが数値である、とわかっている場合でさえ、何の値かは本質的には判らないのです.....すべては約束事の世界なのだから、「規約」判らなければ、何一つ理解できない世界がコンピュータ(というか、情報というもの)なのですね.....

投稿者 : 杉浦 こずえ | 投稿日時 : 2009.02.13 23:59

あすなろBLOGのトラックバック・コメントは承認制になっています。
すぐにブログに反映されませんので、ご了承ください。

トラックバックURL


コメントの送信








カレンダー

<< 2009年02月

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28

最新のエントリー

最新のトラックバック

最新のコメント

Tag

バックナンバー