next up previous contents index
: 再帰呼び出しとスタック : 数の内部表現 : 整数の内部表現   目次   索引

浮動小数点数の内部表現

小数点のある数は計算機のなかで 32 bit または 64 bit のデータとして表現されている. このような数を浮動小数点数とよんでいる. この表現法を Intel 80386 系の CPUを例にして 32 bit 表現の場合に説明しよう. なお, Asir で関数 deval が戻すのは 64 bit の浮動小数点数である.

32 bit データは, 1 bit の符号 $s$, 8 bit の指数部 $e$ , 23 bit の仮数部 $t$ に分割される. ここで

\begin{displaymath}e = (e_7,e_6, \ldots, e_0), \
t = (t_{22}, t_{21}, \ldots, t_1, t_0)\end{displaymath}

である. $s$, $e_i$, $t_i$$0$$1$ の値をとる. 以下, $1.t$

\begin{displaymath}1+t_{22} 2^{-1} + t_{21} 2^{-2} + \cdots + t_1 2 ^{-22} + t_0 2^{-23}\end{displaymath}

を表すものと約束しよう. 80386 系の CPU の場合, $s$ が 0 のとき, 組 $(s,e,t)$ は, 数

\begin{displaymath}1.t \times 2^{e-127}\end{displaymath}

を表す. $s$ が 1 のとき, 組 $(s,e,t)$ は, 数

\begin{displaymath}-1.t \times 2^{e-127}\end{displaymath}

を表す. また $0$ は 組 $(0,0,0)$ または $(1,0,0)$ で表現する.

例:
$1$

 00        00       80       3F
 00000000  00000000 10000000 00111111    e は 011 1111 1
$-1$
 00        00       80       BF
 00000000  00000000 10000000 10111111    e は 011 1111 1 = 127
                             ^ 符号bit
$8$
 00        00       00       41
 00000000  00000000 00000000 01000001    e は 100 0001 0 = 130
                    -         ------- e を決める bit
$1.000000119209 \simeq 1.0/(2^{23}-1)$
 01        00       80       3F
 00000001  00000000 10000000 00111111    e は 011 1111 1 = 127
 --------  --------  -------   仮数部 t を決める bit
 76543210  fedcba98

$e$$0$$255={\tt0xff}$ のときは, 特別な意味をもつ. くわしくは IEEE754 規格をみよ.

上級者向け参考: 浮動小数点数がどのようにメモリに格納できるかを調べるには, メモリを''生''で扱える $C$ や マシン語などの言語を用いると 容易である. Basic などの言語ではこのようなことを調べるのは容易では ない. 次の $C$ のプログラムは, 入力された小数点数がメモリにどのように 格納されているのかを表示する.

#include <stdio.h>
main() {
  float a;
  unsigned char *p;
  int i;
  scanf("%f",&a);  p = (char *)&a;
  printf("%f\n",a); 
  for (i=0; i<sizeof(float); i++) {
    printf("%02x ", *p);
    p++;
  }
  printf("\n");
}

問題 10.3   同じような機能をもつ Asir プログラムを作成せよ.



Nobuki Takayama 平成15年9月12日