理論グループのミーティングの報告

日時: 97/05/06
場所: 斉藤理一郎助教授教官室 西5-517

 
最初に松尾君が単精度浮動小数点数の加算器について説明しました。

 i) 単精度浮動小数点数のフォーマット

   浮動小数点数は符号(sign)を表す1ビット、指数部(exponent)を表す8ビットと仮数部(mantissa)を表す
   23ビットからなります。符号、指数部、仮数部をそれぞれ S,E,M とすれば浮動小数点数の絶対値は

    |F| = (2 ^ E - offset) × 1.M --------------------- [1]
   となります。ここでは
     S : 0 かまたは 1
     E : 0 〜 255
     M : 0 〜 2^23 -1 
     offset = 127  ( 2^(8-1)-1 )
   上式にある1は浮動小数点数を表す32ビットの中にはありません。この1のことを暗黙の1と言います。
   S が 0 の時 F を正数、S が 1 の時 F を負数とします。Eの最大値が 255 の時、Fを∞と見なしま
   す。また、EとMがともに0の時はFの絶対値が最小となりますが、この最小値をゼロと見なします(浮
   動小数点数が本当のゼロになることはありません)。ゼロと∞を除くと、Fが取れる範囲は
     最小値 = 1.00...0 x 2^(1-127) = 1.175 x e^-38
     最大値 = 1.11...1 (1 が全部で24個) x 2^(254-127) = 2^24-1 x 2^(254-127-23)= 3.4028 x e^38
   です。

 ii)浮動小数点数の加算器

  浮動小数点数A、Bのビット表現をそれぞれ Sa&Ea&Ma, Sb&Ea&Mb とします(Sa,Sbは1ビット、Ea,Eb
  は8ビット、Ma,Mbは23ビット,&は各ビット(及びビット)列が連続しているのを意味します)。A と B
  の和 C は
    C = A + B = Ssa×2^(Ea-127)×1.Ma + Ssb×2^(Eb-127)×Mb 
   (Aが正数ならSsa=1,負数ならSsa=-1。Ssb についても同様)
  で与えられます。
   Ea >= Eb ならば、
     C = 2^(Ea-127)×{ Ssa×1.Ma + Ssb×1.Mb×2^(Sa-Sb)}--------------------[2]
   そうでなければ、
     C = 2^(Eb-127)×{ Ssb×1.Mb + Ssa×1.Ma×2^(Sb-Sa)}--------------------[3]
   として計算されます。
   Cを[1]式で定義されているフォーマットに変換しなければならないので [2] と [3] の {} 内
   の値が 2 (再上位ビットにおいて桁上がりが生じる)より大きい時、それを1ビット右シフトす
   る必要があります。また、1.Mb×2^(Sa-Sb)(または 1.Ma×2^(Sb-Sa))も右シフト操作によって
   得られます。正数部(小数点の右側)を含めて仮数部全体は24ビットですから、右シフトする際、
   右側にあるビットが何個か余ります。そこで余るビットを切り捨てる(truncate)か、丸めする
   (round off)必要があります。丸めすると回路規模が大きくなり、計算時間も増えます。しかし、
   計算誤差は切り捨てる場合と全く変わりません。丸めする場合、再上位ビットで桁上がりが生じ
   た時、仮数部を更に1ビット右シフトします。
     {}内を計算する時 Sa,Sb の値に応じて、加算または引き算を分けて、行なうか、計算する前に
   1.Ma と 1.Mb を2の補数表現に直しておいて、計算した後、再び普通の表現(絶対値表現)に戻す
   必要があります。
     E_a と E_b によって右シフトするビット数は最大で23になります。このシフト操作が加算器の
   中で、最も時間がかかる部分です。


次にグェン君が掛け算器について説明しました。
    (以下も上記と同じ記号を用います)

   A と B が同符号の時, C(AとBの積)が正数となり、A と B が異符号の時、C が負数となるので、C
   の符号ビットは A と B の符号ビットの排他的論理和で表せます。
    Sc = Sa XOR Sb ----------------------------------------------------------[4]
   C の絶対値は次式で与えられます。
    |C| = 2^(Ea-127)1.Ma ×2^(2-127)×1.Mb 
        = 2^{(Ea+Eb-127)-127}×1.Ma×1.Mb 
        = 2^{[(Ea+Eb-127)-127]}×1&Ma×1&Mb×2^(-46)-----------------------------------[5]
   先ず {}内の値を計算します。これを Cc とします。Ea と Eb の値によって、8ビットで表せる
   範囲を超えることがあります。Cc が負となった場合(underflow), |C| が[1]式で定義されている
   フォーマットで表現可能な最小値よりも小さいので Cc と Mc に0を代入します。Cc が 255 を超え
   場合(overflow),|C|が表現可能な最大値よりも大きいので Cc に 255 を代入します( |C| を∞と
   します)。

   1&Ma と 1&Mb は24ビットの正数で、その積 1&Ma×1&Mb = Mmultp は48ビットの正数となります。
   Mmultp の最上位 2 ビットをそれぞれ Mmultp[47] と Mmultp[46]とします。
        2> 1.Ma >=1     かつ  2> 1.Mb >= 1
   よって、
        2> 1.Ma×1.Mb >= 1
   したがって、Mmultp[47] と Mmultp[46] は同時に 0 になることはありません(もし、同時に 0 に
   なると、1.Ma×1.Mb = Mmultp[47]&Mmultp[46].xxxx....xxx = 0.xxx....xx <1 になるからです)。
   [1]式で定義されているフォーマットでは仮数部の正数部は 1 であるため、Mmultp[47]=1 の場合、
   Mmultp を1ビット右へシフトし、Ec に1を足す(すると Ec の overflow が起こる可能性があり、
   overflow が生じた場合は前記とどうように Ccに 255 を代入します)必要があります。その後、小
   数部が23ビットになるように Mmultp の23 ビット(Mmultp[47]=0の場合)あるいは22ビット
   (Mmultp[46]=1の場合)を切り捨てるか、丸めします。丸めする時、桁上がりによってMmultp[47]が
   1なる場合は Mmultp を更に1ビット右シフトしなければなりません。
      
   vhdl ファイル : /home2/students/nguyen/vhdl/mult/mult.vhd
   ブロック図    : /home2/students/nguyen/tex/pict/multiplier.xfig
   シミュレーションした波形(psファイル)
                 : /home2/students/nguyen/vhdl/waves.ps
   シミュレーション結果(10進数及び16進数で表した数値)
		: /home2/students/nguyen/vhdl/mult-test

目次に戻る