5 付録


5.1 コンピューターで2進数が使われる理由

人間の指は10本あることは、よく知られている。そのため、人類は10進法を使っていると 言われている。小学校の低学年では指を使って計算する子供がいることからも分かる。コ ンピューターの内部のハードウェアーでは、電圧が0Vか5V(もっと低い場合もある)でデー タやプログラムを表現している。指が2本しかないのと同じ。だから、コンピューターは2 進法を使う。2進法を使うメリットに、何があるか? という疑問が湧くであろう。その答 えとして、以下のようなことが考えられる。
図 5: 2進法と10進法のコンピューターのノイズレベル
\includegraphics[keepaspectratio, scale=1.0]{figure/volts_2_10.eps}

5.2 コンピューター内部での整数以外の表現

これは少しレベルの高い内容で、もう少し時間をかけないと説明できない。2年前、私が2 年生で他の教科を教えていたときには、ここまで講義した。従って、諸君が理解できない わけはない。将来、情報関係の仕事に就きたい者、あるいは自分の能力に自信のある者は 独力で以下の内容を理解せよ。非常におもしろい内容であるはずである。

5.3 負の整数の表現

負の整数は、補数(complement)を使って、コンピューター内部では表現される。それを図 6に示すが、手順は、次の通りである。
  1. 絶対値を2進数のビットパターンで表現し、その反転を行う。
  2. 反転されたビットパターンに1を加算する。
このようにしてできたビットパターンをメモリーに記憶させ、それを負の数として取り扱 う。
図 6: 負の整数をメモリーに格納する方法
\includegraphics[keepaspectratio, scale=1.0]{figure/complement.eps}
この方法のメリットは、減算が加算器でできることである。補数表現のイメージは、 図7の通りです。車の距離計に似ている。
図 7: 距離計イメージ(2の補数表示)
\includegraphics[keepaspectratio, scale=1.0]{figure/image_complement.eps}

それでは、なぜ、補数表現だと、減算が加算器で可能なのだろうか?。減算の演算は、負 の数の加算と同じである。したがって、図7のように負の数を 表現すると、負の整数の加算は正の整数の加算と同じと分かるであろう。したがって、加 算器で減算が可能となる。実際、正の数の減算を行うときは、ビットの反転と+1加算を実 施して、加算器で計算する。イメージは、図7の通りであるが、 もう少し、理論的に説明をおこなうとしよう。ある正の整数をxとする。その負の数、-x は補数表現では、

$\displaystyle [-x]=(FFFF-x+1)_{16}$ (12)

となる。左辺の$ [-x]$$ -x$の意味である。$ [\quad]$の意味は、括弧内の負の整数を計 算機内部の表現を表している。これは、私が作った表記なので、一般には用いられていな い。右辺の$ FFFF-x$がビット反転になっている。ここでは、16ビットで整数を表現しよう としているので、$ FFFF$から$ x$を引いてビット反転させている。疑問に思う者は実際に 計算して見よ。それに1を加えて、補数の表現としている。つぎに、ある整数$ y$を考えて、 y-xを計算してみよう。

$\displaystyle [y-x]=(y+FFFF-x+1)_{16}$ (13)

$ FFFF-x+1$は、あらかじめ計算されて、コンピューター内部のメモリーに格納されている ので、$ [y-x]$は加算器で可能である。これは、あたりまえです。重要なことは、この結 果が、負の場合、2の補数表現になっており、正の場合、そのままの値になっていること である。

演算の結果、y-xが負になる場合を考えよう。すると式(13)は、

$\displaystyle [y-x]=(FFFF-(x-y)+1)_{16}$ (14)

と変形できる。この場合、絶対値が $ (x-y)$ なので、絶対値のビット反転と+1加算となっ ていることが理解できる。つぎに、$ y-x$が正になる場合を考えましょう。すると式(13)は、

$\displaystyle [y-x]$ $\displaystyle =(y-x+FFFF+1)_{16}$    
  $\displaystyle =(y-x+10000)_{16}$ (15)

となる。10000は計算機内部では、桁上がりを示す。16ビットの表示では無視される。し たがって、内部の表現は、正しく表せる。

コーヒーブレイク
この方法で負の数を表すことは、1970年頃には常識となったようです。驚いたことに、負 の数をこの補数で表すアイディアは、パスカルが最初です。パスカルは、パスカリーヌと いう歯車式計算機を1642年頃に製作しています。そこの減算を加算器で行うために、補数 というものを考えたようです。

5.4 浮動小数点表示

浮動小数点表示とは、指数化(例えば、 $ -0.123\times 10^{-2}$)して数値を表現する。 これは非常に便利な方法で、自然科学では多くつかわれる。コンピューターでも同様で、 データが整数と指定されない限りこの浮動小数点が用いられる。実際、この仮数部の (-0.123)と指数の(-2)をメモリーに格納する。この方法の長所と短所は、以下の通りであ る。
長所
決められたビット数内で、非常に小さな数値から大きな数値まで表現可能になる。
短所
桁落ち誤差が発生する場合がある。
浮動小数点表示を学習するために、必要な言葉の意味は、図8の 通りである。1年生の数学の授業で学習したはず。
図 8: 指数表現の名称
\includegraphics[keepaspectratio, scale=1.0]{figure/floating_point.eps}

IEEEの規格のC言語の倍精度実数型のdoubleの表現について説明する。まず、浮動小数点 表示のための正規化を図5に示す。当然、仮数部、指数部とも2進数表現です。仮数部は、 符号と1.XXXXのように表す。

図 9: IEEE規格表現のための規格化
\includegraphics[keepaspectratio, scale=1.0]{figure/IEEE_normalize.eps}

つぎに、これをIEEE規格の浮動小数点に表すことを考える。まずその規格の仕様は、以下 のようになっている。

図 10: IEEE規格(C言語の倍精度実数)表現のビットの内訳
\includegraphics[keepaspectratio, scale=1.0]{figure/IEEE_bit_spec.eps}

以上の仕様をもとに、図9で規格化された数を浮動小数点表示を 示す。ほとんどの部分は規格化で分かるが、指数のみ計算が必要である。指数は、オフセッ トバイナリーで計算するために、まず10進数で表す。

$\displaystyle (-1011)_2=(-8-2-1)_{10}=(-11)_{10}$ (16)

不動小数表示の指数は、この式の値に 1023 を加算して求める。すると、

$\displaystyle (-11+1023)_{10}=(1012)_{10}=(1111110100)_2$ (17)

となる。

これで、すべて準備が整った。不動小数点表示は、図11のようにな る。実際のコンピューターには、この64ビットのデータが格納される。メモリーは8ビッ ト(1バイト)毎アドレスが割り当てられているので、8番地分のデータ領域が必要である。

図 11: IEEE規格の浮動小数点表示の例
\includegraphics[keepaspectratio, scale=0.5]{figure/IEEE_example.eps}

5.5 少数の表現(おまけ)

ここまで、書く時間が無かった。興味のある者は、自分で調べよ。私の以前の講義ノート にも書いてある。
ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成17年6月6日


no counter