電子計算機
第8回
|
電子計算機固定および浮動小数点表示コンピューター内部での実数の表現方法を学びます.現代のコンピューターでは,浮動小数点表示が使われます.その具体的な方法を示します. 目次講義を始める前に本日の授業のテーマ本日の授業のテーマは,以下のとおりです.
本日の授業のゴールは、以下のとおり。
先週の復習
固定小数点表示2進数で、小数点の位置を固定した表現です。 一般的に、右端に小数点を固定します。したがって、整数のみを表わすることになります。 負の数は、2の補数をつかいます。例えば、8ビットで(-107)10を表現すると、図1のようになります。計算機内部で、(-107)10は(10010101)と表現されます。 これは、いままで、さんざん学習してきたので、これ以上の説明はしません。 浮動小数点表示浮動小数点表示とは浮動小数点表示とは、指数化(例えば、-0.123×10-2)して数値を表現します。これは非常に便利な方法で、自然科学では多くの場合、このように数値を表現します。コンピューターでも同様で、データが整数と指定されない限りこの浮動小数点が用いられます。実際、この仮数部の (-0.123) と指数の (-2) をメモリーに格納します。この方法の長所と短所は、以下の通りです。
浮動小数点表示を学習するために、必要な言葉の意味は、図2の通りです。1年生の数学の授業で学習したはずです。 ここでは、教科書に示されている2通りの方法と、秋田高専の計算機サーバー(なまはげ君)でのC言語での固定小数点表示を示します。 オフセットバイナリを使う方法 (教科書)教科書にはきっちりと仕様が書かれていません。そこで、補数は使わないで、絶対数表現ということで話を進めます。教科書の不足分を補っているだけで、教科書とは矛盾はしません。 まず例として、 (-0.0390625)10 = (-0.0000101)2 = (-0.0a)16 = (-0.a×10-1)16 を浮動小数点表示することを考えます。10進数のを16進数で正規化しています。正規化というのは、仮数部の整数部をゼロにして、小数点一桁目を 1 — F までの数字で表すことを言います。 正規化後、以下の操作をすれば、浮動小数点表示ができます。
以上ですべてのビットが決まったので、コンピューター内部では、図3のように表現されます。 指数符号ビットを使う方法 (教科書)これも、教科書にはきっちりと仕様が書かれていませんので、補数は使わないで、絶対数表現ということで話を進めます。 ほとんど、先ほどのオフセットバイナリーを使う方法と同じです。異なるのは、指数部がオフセットバイナリではなく、絶対値表現になっていることだけです。先ほどと、同じ問題、(-0.0390625)10の表現を考えます。先ほどの操作の (1) と (3) は全く同じです。(2) は、 (2) 指数 -1 は、負の数なので指数符号ビットは 1 になります。その絶対値の (1)16=(1)2 です。これを6ビットで表すと、(000001)2 です。 となります。これで、すべてのビットが決まったので、コンピューターの内部の表現は、図4のようになります。 C言語の倍精度実数の表現IEEE の規格のC言語の倍精度実数型の double の表現について説明します。まず、浮動小数点表示のための正規化を図5に示します。当然、仮数部、指数部とも2進数表現です。仮数部は、符号と 1.XXXX の表現にします。 つぎに、これをIEEE規格の浮動小数点に表すことを考えます。まずその規格の仕様は、以下のようになっています。
以上の仕様をもとに、図5で規格化された数を浮動小数点表示します。ほとんどの部分は規格化で分かりますが、指数のみ計算が必要です。指数は、オフセットバイナリーで計算するために、まず10進数で表します。 \begin{align} (-1011)_2=(-8-2-1)_{10}=(-11)_{10}\label{eq:-11} \end{align}不動小数表示の指数は、この式\eqref{eq:-11}の実際の値に、1023 を加算して求めます。すると、 \begin{align} (-11+1023)_{10}=(1012)_{10}=(1111110100)_{10} \end{align}となります。 これで、すべて準備が整いました。不動小数点表示は、図7のようになります。実際のコンピューターには、この64ビットは、8ビット(1バイト)毎アドレスが割り当てられたメモリーに格納します。したがって、メモリーの8番地分のデータ領域が必要になります。 プログラム言語と表現方式初心者がプログラミング言語を学び始めると、変数の宣言に戸惑います。数学を勉強するとき、変数に宣言など使ったことがないからです。また、宣言がなくても、アルゴリズムに不都合がないからです。変数の宣言が無くても、問題がないように思ってしまいます。 変数の宣言がなくても、アルゴリズム上、問題はありません。しかし、コンパイラーにとっては、大きな問題です。コンパイラーがソースプログラムをマシン語に翻訳する場合、その変数を表現するための領域の大きさ(バイト数)と表現方法を決める必要があります。 できるだけ大きな数字が表現できる型、例えば FORTRAN の4倍精度実数型に統一する方法もあります。しかし、そうすると以下のような問題が生じます。
これらを、コンパイラー言語では、型宣言によって避けます。効率的なマシン語を作成するために、変数の宣言は絶対に必要となるのです。参考のために、表1, 2にFORTRANとC言語の代表的な宣言を示します。 一方、インタープリンター方式の言語の場合、型の宣言が無い場合があります。例えば、BASIC や Perl のような場合、型宣言は不要です。あらかじめ、データ領域を確保する必要が無く、必要になったら、適当に領域を確保しているためだと思います。詳細は、良くわかりません。
|