前回はA/Dコンバータについてお話ししましたが、その続きとして今回は、バイナリデータ(2進数データ)についてお話しします。
現在のコンピュータの世界で信号処理するデータは、すべて2進数(バイナリ)で処理されています。もちろん前回話したA/Dコンバータの出力も2進数のディジタルデータです。
2進数で数値データを表現する方法は、大きく分けて、固定小数点形式と浮動小数点形式があります。これらについて説明します。
固定小数点形式は、小数点をどこに固定するかで表現する数字が変わってきますが、とりあえず、小数点が右端にある、すなわち整数だけを考えます。一般に固定小数点形式の2進数表現は、以下の種類があります。
-
ストレートバイナリ(符号なしバイナリ)
-
オフセットバイナリ
-
2の補数バイナリ
1は、正の整数(自然数)と0(零)だけ表すことができ、負の整数は表現できません。それに対して、2と3 は正だけでなく負の整数も表現できます。
次ページ表1は、8ビットの2進数数値を3種類のバイナリ表現を比較した例です。
8ビットバイナリですから256(= 28)の数値表現が可能ですが、1は0 ~ 255までの整数、2と3は、-128 ~ 127までの整数を表現できます。また、2と3では、最上位ビット(MSB)は符号を表していてMSBを反転させることにより簡単に相互変換可能で実質同じ表現ですが、0(零)の表現において、3はすべてのビットが0となりわかりやすいので、コンピュータの世界では、2の補数形式のバイナリ表現が一般的に使用されています。すなわち、2の補数バイナリでは、正の数はMSBが0、負の数はMSBが1、0(零)はすべてのビットが0となります。なお、A/DコンバータやD/Aコンバータにおける入出力バイナリ表現では、2や3がよく用いられています。
-
表1.3種類のバイナリ表現の比較
例えば、プログラム言語Cの変数において、整数型は以下があり、これも内部の表現は、2の補数バイナリです。
| 整数型 | バイト数 | ビット数 | 数値範囲 |
| int | 4 | 32 | -2,147,483,648 ~ 2,147,483,647 |
| long | 4 | 32 | -2,147,483,648 ~ 2,147,483,647 |
| short | 2 | 16 | -32,768 ~ 32,767 |
| char | 1 | 8 | -128 ~ 127 |
表2.固定小数点表現の整数変数の数値範囲(C言語の例)
(注1)符号なし(Unsigned)整数もあります。
(注2)最近の64ビットPCでは、long long int(64ビット)もあるそうです。
さて、固定小数点形式で、小数のある数値を表すためには、小数点を適当な桁に固定する必要があります。例えば、8ビット(2の補数形式)で4桁目と5桁目の間に小数点があるとすると(図1)、10進数で(5.625)10を2進数に変換すると、(0101.1010)2となり、この結果を小数点のない整数と見なすと、(01011010)2 =(90)10となります。一般に2進数で小数点を1桁左に移動することは数値を1/2することに相当して、このケースでは4桁移動していることになりますので、90を16(= 24)で割ると5.625となることが分かります。
-
図1.小数点を含む固定小数点形式の例
このように、固定小数点形式で小数点の移動は非常に簡単な信号処理なので、小数点の位置は一番右(すなわち整数)と見なすか、または、一番左(すなわちすべて小数値、最大値が1)と見なして、最終的に適当な数値に換算する方法が一般的です。
固定小数点形式は、① 演算処理が比較的簡単で高速演算に適する、② 表現できる数値範囲内では桁落ちが少ない、などのメリットがあるので、DSPを使った画像処理やディジタルフィルタ処理などによく用いられます。
デメリットしては、① 表現できる数値範囲が狭い(オーバフローしやすい)、② 小数を含む実数値を扱いにくい(小数点を常に考えてプログラムする必要がある)などがあり、複雑な信号処理では、あまり使われていません。
浮動小数点形式は、小数点を含む任意の実数をコンピュータ上で表現できる数値データ形式で、その表現形式は、以前は、コンピュータメーカや半導体メーカ各社でバラバラでしたが、最近は、IEEE754規格で規定されている標準的な形式が最も広く採用されています。
その形式には、32ビット(単精度)と64ビット(倍精度)の2つの表現形式があり、図2と図3に示します。また、表現できる数値範囲は表3のようになります。
-
図2.浮動小数点(単精度)の表現形式
-
図3.浮動小数点(倍精度)の表現形式
| 実数型 (C言語) | 最大の数 (絶対値) | 最小の数 (絶対値) | 有効数字 (10進数) | |
| 単精度 | float | 約3.40x1038 | 約1.18x10-38 | 約6桁相当 |
| 倍精度 | double | 約1.80x10308 | 約2.23x10-308 | 約16桁相当 |
表3.浮動小数点形式で表現できる数値範囲
この形式は、仮数部と指数部とも絶対値で表現して、特に指数部は、バイアス(単精度は127、倍精度は1023)をのせた正の数値となっています。また、数値を正規化すると仮数部の最上位ビットは必ず1となる(0でない限り)ことを利用して、最上位ビットを省略(暗黙の1ビット)した表現となっています。このような巧妙な方式に最初に出合ったのは、米国マイクロソフト社のMS Basicの浮動小数点形式で、筆者も非常に感心した記憶があります。
浮動小数点形式は、このように表現できる数値範囲が非常に大きく、演算オーバフローを気にせずプログラミングすることができるため、科学技術の計算や数値解析などに広く使われています。ただ、その結果の精度をそれなりに求めるならば、その誤差に関して留意して使用すべきです。普通の演算には、処理スピードの都合上単精度で良いのかもしれませんが、倍精度演算でその演算精度を確認するようにするべきです。
浮動小数点演算の誤差解析に関しては、筆者の能力を超えるため、お話しできませんが、代表的な弱点としては、「ほぼ同じ値の減算において有効数字が大きく減少する」という桁落ち現象があります。このような原理的な限界を考慮して、プログラミングするように心がけるべきと思います。
(2008年11月20日発行メールマガジンより抜粋)