アットウィキロゴ

7.実数表現

(3).実数の表現形式

(復習)10進実数を16進にする。
○整数部分⇒通常通り、10進を16進にする。
   与えられた数を16で割り、余りを求める。
   この操作を繰り返し、商が0になったら、下から余りを並べる。
○小数部分⇒16倍して整数部分の数を求める。
   さらに、その小数部分の数を16倍する。この操作を繰り返し、整数部分の数を上から並べる。

(例題) 2011.1027を16進実数にする。
(解答) 2011÷16=125...11
      125÷16=7...13
        7÷16=0...7    これより、整数部は、7DB
  0.1027×16=1.6432
  0.6432×16=10.2912
  0.2912×16=4.6592
  0.6592×16=10.5472
  0.5472×16=8.7552
    ・・・                  これより、小数部分は、0.1A4A8\dots 
  以上から、7DB.1A4A8\dots となる。

現在、使用されている実数表現方式には、「IBM方式」「IEEE(アイトリプルイー)方式」の2通りある。
 ①.IBM方式 ・・・  汎用コンピュータで従来使用されていた方式。
 ②.IEEE574方式 ・・・ 国際標準で制定された方式。マイクロソフト、インテル、モトローラ、などのプロセッサで採用された。現在のパソコンで幅広く使用されている。

①IBM方式の実数表現

単精度実数(4バイト)と倍精度実数(8バイト)は次のように構成される。(16進1桁=4ビット、である。)
符号 指数部 仮数部 全体
単精度実数 1ビット 7ビット(Bias=64) 24ビット(16進6桁) 4バイト(32ビット=16進8桁)
倍精度実数 1ビット 7ビット(Bias=64) 56ビット(16進14桁) 8バイト(64ビット=16進16桁)
なお、仮数部ではみ出した部分は「7捨8入」を行う。
符号部分は、「0」なら0または正の数、「1」なら負の数を表す。

(例題1) 1234.56をIBM単精度実数で表す。
(解答例)前回の問題より、B=16として正規化すると、
 1234.56=4D2.\dot{8}F5C\dot{2}=0.4D2\dot{8}F5C\dot{2}\times16^3
となり、E=3,M=0.4D2\dot{8}F5C\dot{2}\がわかる。
符号は正数だから先頭の1ビットは「0」で、E=3+64=67=1000011(64はBias。64だけずらして指数部は表現する)
ゆえに、「434D28F6」となる。(6桁目は「7捨8入」)している。

(例題2) IBM単精度実数「42C1000」を10進数で表す。
(解答例)42C1000より、先頭1バイトが42=0100\ 0010なので、符号は「0」で正。
さらに、指数部は、1000010_{(2)}=66_{(16)}より、66-64=2.
表現された数は、
  +0.C1_{(16)}\times16^2 =C1_{(16)}=12\times16+1=193
より、193である。

Bias(バイアス)について

指数部分は、2進7ビットだから、「0000000」~「1111111」まで表現できる。
これは、10進に直すと、「0」~「127」であり、このままだと、大きい数しか取り扱うことが出来ない。
これを回避するために、Bias分だけ、ずらせて表現する。
IBM形式の場合、Bias=64だから、「0」を「-64」、「127」を「63」だとして、小さい数も表現できるように対応している。
Biasがあるために、小さい数も表現できるわけである。

(復習)10進数11.17をIBM単精度実数に直せ。
(解答) 整数部分は、11=B_{(16)}である。
  0.17×16=2.72
  0.72×16=11.52
  0.52×16=8.32
  0.32×16=5.12
  0.12×16=1.92
  0.92×16=14.72
    ・・・                  これより、小数部分は、0.2\dot{B}851\dot{E}となる。 
  以上から、B.2\dot{B}851\dot{E} となる。
ゆえに、B.2\dot{B}851\dot{E}=0.B2\dot{B}851\dot{E}\times16^1となり、
 指数は、E=1となるので、指数部は1+64=65で、2進数に直すと、=1000001となる。
 符号は正の数だから、先頭1ビットは0。ゆえに、先頭の8ビットは、01000001=41_{(16)}である。
 仮数部は16進6桁で、7桁目は「7捨8入」する。
 これより、B2B852となり、2つ合わせて「41B2B852」が答えである。

②IEEE754方式の実数表現

単精度実数(4バイト)と倍精度実数(8バイト)は次のように構成される。(16進1桁=4ビット、である。)
符号 指数部 仮数部 全体
単精度実数 1ビット 8ビット(Bias=127) 23ビット 4バイト(32ビット=16進8桁)
倍精度実数 1ビット 11ビット(Bias=1023) 52ビット 8バイト(64ビット=16進16桁)
なお、仮数部ではみ出した部分は2進数で「0捨1入」を行う。
符号部分は、「0」なら0または正の数、「1」なら負の数を表す。

IEEE754方式の特徴

1.基数B=2
   表示形式は、\pm M\times2^E である。
2.隠しビット
3.仮数部ではみ出した部分は、2進数で「0捨1入」する。

隠しビット

 IEEE754は、基数が2なので、2進表示にして、「1.△△△」の形に直して(正規化)、「1.」の部分を省略して
仮数部を「△△△」で表す。これを「隠しビット」という。
 IEEE754では、仮数部は23ビットだが、隠しビットにより24ビットの精度を保つ。

(例) 10進数0.1=0.1\dot{9}_{(16)}である。
 0.1=0.1\dot{9}_{(16)}=0.0001\dot{1}00\dot{1}_{(2)}
     =1.\dot{1}00\dot{1}\times2^{-4}
となるので、E=-4, M=\dot{1}00\dot{1} が得られる。

(例題) 10進数11.17をIEEE754方式の単精度実数で表す。
上の問題より、11.17=B.2\dot{B}851\dot{E}であるので、
   =1011.0010\ \dot{1}011\ 1000\ 0101\ 0001\ 111\dot{0}
   =1.0110\ 010\dot{1}\ 0111\ 0000\ 1010\ 0011\ 11\dot{0} \times 2^3
であるので、
  符号ビット=0
  指数部=3+127=130=1000\ 0010_{(2)}
  仮数部=0110\ 0101\ 0111\ 0000\ 1010\ 0011 (先頭から24ビット)
      =0110\ 0101\ 0111\ 0000\ 1010\ 010 (24ビット目を0捨1入する)
であるので、まとめると、
  0\ 1000\ 0010\ 0110\ 0101\ 0111\ 0000\ 1010\ 010=4132B852_{(16)}となる。

(4).表現可能な範囲

IBM方式とIEEE754形式を比較する。

IBM方式単精度の表現可能な数

(最大の正数) B=16で、指数はE=63、仮数部はM=0.FFFFFFが最大であるから、
   0.FFFFFF_{(16)}\times16^{63}=(\frac{15}{16}+\frac{15}{16^2}+\frac{15}{16^3}+\frac{15}{16^4}+\frac{15}{16^5}+\frac{15}{16^6})\times16^{63}
      =\frac{15}{16}(1+\frac{1}{16}+\frac{1}{16^2}+\frac{1}{16^3}+\frac{1}{16^4}+\frac{1}{16^5})\times16^{63}
      =\frac{15}{16}\frac{1-\frac{1}{16^6}}{1-\frac{1}{16}}\times16^{63}
      =(1-\frac{1}{16^6})\times16^{63}\approx 16^{63}\approx 7.023701\times10^{75}
(最小の正数) B=16で、指数はE=-64、仮数部はM=0.1が最小であるから、
   0.1_{(16)}\times16^{-64}=16^{-65}\approx 5.39761\times10^{-79}
となる。

  • IEEE754方式の場合、単精度と倍精度で、指数部のビット数が異なるので、表現できる最大数・最小数が精度によって異なる。

IEEE754方式単精度の表現可能な数

(最大の正数) B=2で、指数はE=128、仮数部はM=1.11111111111111111111111(23桁)が最大であるから、
   1.11111111111111111111111_{(2)}\times2^{128}=(1+\frac{1}{2}+\frac{1}{2^2}+\dots+\frac{1}{2^{23}})\times2^{128}
      =\frac{1-\frac{1}{2^{24}}}{1-\frac{1}{2}}\times2^{128}=(1-\frac{1}{2^{24}})\times2^{129}\approx 2^{129}\approx 6.80565\times10^{38}
(最小の正数) B=2で、指数はE=-127、仮数部はM=1.0が最小であるから、
   1.0_{(2)}\times2^{-127}=2^{-127}\approx 5.87747\times10^{-39}
となる。
  • IEEE754単精度は、IBM単精度よりも表現できる範囲が小さいことが分かる。ところが、下記で述べるように、倍精度は驚くほど広い。これが、現在のPCでIEEE754が採用されている理由になっている。

IEEE754方式倍精度の表現可能な数

(最大の正数) B=2で、指数はE=1024、仮数部はM=1.11111111111111\dots111111111(52桁)が最大であるから、
   1.1111111111111111\dots1111111_{(2)}\times2^{1024}=(1+\frac{1}{2}+\frac{1}{2^2}+\dots+\frac{1}{2^{52}})\times2^{1024}
      =\frac{1-\frac{1}{2^{53}}}{1-\frac{1}{2}}\times2^{1024}=(1-\frac{1}{2^{53}})\times2^{1025}\approx 2^{1025}\approx 1.79769\times10^{308}
(最小の正数) B=2で、指数はE=-1023、仮数部はM=1.0が最小であるから、
   1.0_{(2)}\times2^{-1023}=2^{-1023}\approx 2.22507\times10^{-308}
となる。

(注意)以上のように、どの方式にも表現できる最大数と最小数が存在する。
最大数を超えると「オーバーフロー(overflow)」になり、最小数を超えると「0」と判定される。0でない小さい数であっても、0として認識されることは、計算の限界があることになる。

最終更新:2012年11月01日 09:32