2012年6月25日月曜日

固定小数点演算信号処理の極意シリーズ (その3) floatとint

前回はFPGAで固定小数点演算するのが最もチープだぜぇっていう話でした.今回は、固定小数点演算と浮動小数点演算の違いをサラッと解説します.------うまく解説できる自信はないんだが------

固定小数点演算っていう概念自体を普通は知らないと思います.なぜかというと、C言語には浮動小数点演算が実装されているので、フツーは何も考えずに
   float x;
   double y;
   x = 1.23456e-12;
   y = x / 9.87654321e-36;
などと浮動小数点演算をバシバシ使えるからです.

これ、浮動小数点演算をなにげなく使っていますけど、C言語のコンパイラが隠れて上手に処理してくれているからユーザーには簡単に見えているだけで、実際の内部処理はややこしくて、その数値のメモリへの格納だけでも下図のようにめんどくさいです.
わたしの想像ですけど、たとえばxとyを掛けるときには、①仮数部同士を掛ける→②指数部同士を加える→③指数部の桁上げ桁下げを仮数部に加える→④符号をつける という4段階の手順を経るのでしょう.答えを得るまでに要する命令step数も長くかかります.つまり、高速で動かすのは難しい.高速な信号処理が難しい、となります.

一方で、固定小数点数値のメモリ上への格納は、たとえばC言語の整数のlongだったら 単純に32bitの符号付き整数がメモリ上に置かれるだけです.上の図に似せて描くとこんな感じです.構造が簡単です.
xとyを掛けるときには、乗算回路にxとyを入力すれば1クロックでxyを取り出せます.なのでとても高速ですし、回路規模も小さくて済みます.速くて安いを享受できます.
ただし、固定小数点演算の設計が難しいのは、桁数が変わるのを設計者が管理しなくちゃいけないということです.具体的には次のように、32ビット同士を掛けると64ビットに桁数が膨らみます.32ビット同士を足すと33ビットに桁数が膨らみます.
このいけ好かない状況をどうやって処置したらいいんだよってのは当シリーズのずっと後で解説しますが、ひとまず今は、固定小数点演算回路は速くて安いけど設計は大変だ、ということだけ理解してください.

ではつづく.             つぎへ        前へ

人気ブログランキングへ

0 件のコメント:

コメントを投稿