2014.9.11

前へ
次へ
ホームページトップへ戻る

MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!


[第35回]


●前回の訂正です

前回はうっかりして正しくないことを書いてしまいました。
今朝になりましてから追記をして訂正いたしましたが、昨夜(9月10日夜)から今朝(9月11日朝)までの間にご訪問いただいた方はその追記はお読みいただいてないと思いますので、ここであらためて訂正させていただきます。
前回、0.5は指数部がFF(−1)で仮数部が7FFFFFです、と書いてしまいましたがそれは間違いでした。
末尾に誤差が含まれている、指数部がFFで仮数部が7FFFFDという数を説明するつもりで、ついその数に引きずられてしまいました。
0.5は指数部が00で仮数部は400000でした。
ここに訂正してお詫び申し上げます。

そのように書きましても、2進数の浮動小数点数についてご存知ない方にとりましては、いったいなんのこっちゃ、ということになりましょう。
そこで脱線ついでに簡単にご説明申し上げます。

●2進浮動小数点数の正規表現

通常のプログラムでは十進数は2進数に置き換えて計算処理を行なうということはご存知のことと思います。
一般にそのことは整数値について語られます。
しかしそのこと(十進数を2進数に置き換えて計算すること)は整数に限らず小数を含む実数でも同じことなのです。
ただし十進数の整数が比較的容易に2進数に変換できるのに対して、実数は簡単ではありません。
たとえば上に書きました0.5は2−1ですが2進数の一般的な表現ではそれを示すことはできません。
そこで約束事としてたとえば4バイトを使って見た目は整数なんだけれどもそれを実数として扱いましょうというルールが2進数の実数表現なのです。

うう。
わかりませんか?
わかりませんよねえ。

こういうことです。
たとえば2進数で
01111111 11111111 11111111
という数は 7FFFFF ですから8388607(223−1)を2進数に置き換えたものです。
その場合小数点は最下位桁の右にあります。
この同じ数の並びを使って、小数点が最上位桁の右(左端の0と1の間)に有るものとして数値を扱うというように約束して考えます。
すると0のすぐ右にある1は2−1です。
その右の1は2−2です。
というように考えると上の数は、2−1+2−2+…2−23という数になります。
この値を求めるのに、ひとつひとつを計算して全部を加算するのは大変な手間ですが、実は上の数は1−2−23と同じです。
−23は≒0.0000001192ですから、上の数は十進数の実数表現では0.9999998808という数を示すことになります。

しかしこれだけでは1よりも大きい実数を示すことができません。
整数部と小数部を分けて2本立てで表現する考え方もあります。
それは固定小数点の考え方です。
それもひとつの考え方です。
しかし一般にはそのように整数と小数を分離せずに、上で説明した数と同じ枠の中で一緒に扱ってしまいます。
それが浮動小数点の考え方です。

上の数は3バイトですが、この上位にもう1バイトを加えます。
その1バイトを指数部とします。
そして今まで説明してきた3バイトの数を仮数部とします。
この指数部と仮数部を合わせて1つの実数をあらわします。
すると仮数部が同じでも指数部を変えることで異なる数値をあらわすことができるようになります。

ちなみに仮数部は上の通りとして、指数部が00000101(05H)という数を考えてみます。
これは仮数部の数値×2という数を意味します。
実はその値は仮数部の01111111 11111111 11111111を0をまたいで左に5ビット分シフトして、0より左に出た分が整数であるとした数と同じになります。
すなわち整数部が11111=31で小数部が01111111 11111111 11100000になります。
小数部を計算すると1−2−18≒0.9999961853になりますから、あわせると31.9999961853という数を表すことになります。

そこで、前回うっかり間違えてしまった指数部がFFで仮数部が7FFFFFという数について考えてみます。
指数部は符号付きの数です。
ですからFFは255ではなくて−1になります。
これは仮数部の数値×2−1という数を意味します。
その値は仮数部の01111111 11111111 11111111を右に1ビットシフトした数と同じです。
00111111 11111111 11111111です。
これは2−1−2−23と同じです。
計算すると0.4999998808になります。

そして前回出てきました指数部がFFで仮数部が7FFFFDは計算で求めた0.5の近似値です。
正しい0.5との差は2−23+2−24≒0.00000018です。

うーん。
うまく説明できないまま、かつ脱線したまま、本日は時間がなくなってしまいました。
続きは次回にいたします。

MYCPU80でCP/Mを![第35回]
2014.9.11upload

前へ
次へ
ホームページトップへ戻る