FPGAを使った数値演算回路実現の勘所(3) ―― 浮動小数点演算器の構成を考える Part 1
今回は,浮動小数点演算の基礎,および浮動小数点による四則演算の処理手順について説明します.固定小数点演算の場合と異なり,浮動小数点演算では,フォーマットや有効けた数,誤差などについての正確な理解が求められます.取り扱いが面倒な浮動小数点演算ですが,仕組みをきちんと把握していれば,効果的にFPGAへ回路を実装することができます.(編集部)
技術解説・連載「FPGAを使った数値演算回路実現の勘所」 バック・ナンバ
第1回 加算器の構成を考える
第2回 乗算器の構成を考える
FPGAにおける浮動小数点演算回路の実現を考えてみます.
「浮動小数点演算」.
何だか面倒くさそうな印象しか与えないような響きですね.筆者も昔は避けて通りたい方式でしたし,面倒なのは今も変わりません.少なくとも固定小数点演算より面倒であることは事実ですし,避けて通れるのであれば,それに越したことはないでしょう.しかし,手間をかければ大きな恩恵を与えてくれる方式であることも事実です.もちろん,あらゆる局面において効果があるわけではありません.適さないアプリケーションも多く存在するので,誤解なきように.
FPGAで浮動小数点演算を採用する場合,「乗算ハード・マクロが18ビット×18ビットなのだから,単精度さえ実現できないのでは?」という質問を受けることがあります.本当にそうでしょうか.
答は「No」です.単精度を実現できないわけがありません.若干の工夫とリソースは必要となりますが....前回の乗算器の実現方法を参照していただければ,その方法は理解していただけると思います.ただし,「18ビット×18ビットでは足りないのだろうか」というところまで話を戻せば,もっと有効に浮動小数点演算をFPGAへ持ち込むことも可能になります.ここではそのような話を,2回に分けて説明していきましょう.
1.浮動小数点形式の基礎知識
浮動小数点形式になじみのない方のために,大ざっぱに浮動小数点形式を説明しておきましょう.より詳しく,あるいは正確に知りたい方は,その方面の書籍で勉強しましょう.参考文献(1)でもある程度は説明していますので,参考にしてください.
●浮動小数点形式って何だろう?
文字が表わしている意味をそのまま解釈すれば,「小数点位置が必ずしも実際の整数部と小数部の境にない」ということになります.「その数が持っているけた方向の大きさを分離して表現する形式」とでも言ったほうがイメージしやすいでしょうか.10進法を例にとれば,以下のような表現が可能です(科学記数法という).
987.6=9.876×102 (1)
けた方向の大きさを10のべき乗を乗ずることで表現すると(式(1)では102にあたる部分.2乗の部分を「指数部」という),残った部分は整数部1けたと小数になります(式(1)では9.876にあたる部分.これを「仮数部」という).これにより,仮数部の値の範囲は,以下のようになります.
1≦仮数部<10 (2)
仮数部の最上位の重みは100=1となります.これが10進法における浮動小数点形式です.
この記数法の優れている点は,仮数部を見るだけでその数の有効けたが何けたなのかがすぐに分かるというところです.式(1)では4けたということになります.
ここまでの例において,10を「法とする数」と読み替えれば,これを2進法に置き換えることは簡単です.10101101.12(=173.510)を例にとれば,以下のようになります.
10101101.1=1.01011011×27 (3)
形式的には式(1)と何ら変わるところはなく,仮数部の最上位の重みは20=1となります.もしその数が負であった場合,正負を表わす部分(これを「符号」という)を分離して表現するのが一般的で,これは符号付き絶対値表現と呼ばれます.以下の式はその例です.
-10101101.1=(-1)1×1.01011011×27 (4)
以上から,以下の三つの要素で数値が表現できることになりました.
- 符号(sign)
- 指数部(exponent)
- 仮数部(significand)
一般化すれば,以下の式のとおりとなります(ここでのsignificandは,暗黙の1を含んでいる).
(-1)sign×significand×2exponent (5)
法とする数は大前提なので,数の表現の中には含めていません.このような形式の数値表現を用いる場合,仮数部の小数点以下を何けたにするかですが,2進法の数値としてハードウェアまたはソフトウェアで用いる場合,データの互換性を保つためにけた数をそろえることが一般的です.ハードウェアはまだしも,ソフトウェアでは互換性のないデータをやり取りすることが困難だからです.
これにより,その数が持っている有効けたは常に一定である,ということが言えると同時に,常にある程度の誤差を含んでいるということになるのです.例えば,仮数部を8けたにそろえた場合,本来10けただった数は下位を丸めて8けたに押し込まなければなりません.演算を繰り返していく過程で,この誤差が一定以上に大きくならないように気をつけなければなりません.誤差が大きくなりすぎると,わざわざ用意したけたが無効になってしまいます.
このように,いろいろと考えることが多くなってしまう点が,「浮動小数点は面倒だ」と感じる理由の一つになっていると思います.