二進化十進表現
出典: フリー百科事典『ウィキペディア(Wikipedia)』
二進化十進数 (BCD、Binary-coded decimal )とは、コンピュータにおける数値の表現方式の一つで、十進表現での1桁を、0から9までを表す4桁の二進数で表したものである。「二進化十進符号」などとも呼ばれる。
一般に4桁の二進数は、0から15までの整数を表すことができるが、二進化十進法ではこのうちの最初の10個を有効な数値として扱う。
十進数 | BCD表現 | 十進数 | BCD表現 |
0 | 0000 | 5 | 0101 |
1 | 0001 | 6 | 0110 |
2 | 0010 | 7 | 0111 |
3 | 0011 | 8 | 1000 |
4 | 0100 | 9 | 1001 |
例えば 127 という十進数は、 0001、0010、0111 という3つのBCDで表される。
二進法で計算を行う多くのコンピュータでは、このBCD表現を使用しての結果は、しばしばこの有効範囲を超えるために、計算後に改めて補正を行う必要がある。 メインフレーム、例えばNECのACOS-6シリーズなどの大型のコンピュータに使用されるプロセッサでは、BCDを直接処理できる機械語命令を備え、事務処理演算の効率化を図っており、また、小型のコンピュータでも、この補正の処理を簡単にする命令を備えることも少なくない。BCDで数値の正負を扱う必要がある場合には、その絶対値とは別の領域に符号を格納することで表現する。例えば、インテル社の32ビット・アーキテクチャ「IA-32」で使用される「80ビット・パックドBCD整数」では、先頭から72番目までのビットで18桁の十進数を表し、末尾の80番目のビットに符号を格納している。
2進化10進数には、ゾーン形式とパック形式があり、用途に応じて使い分けられる。符号部を持たないゾーン形式では、ファイルなどの中のデータを十六進数で表示しても十進数と同じように表示されるのでわかりやすい(例えば、十六進数で「1234」となっているデータがあれば、十進数の「1234」のことである)。ただし、符号部を持つ場合も多く、そちらは必ずしもわかりやすいとは言えない。
またより簡単な利用法としては、電子回路上で、0~9を表示可能なBCD対応の数字表示素子1つに対してBCDの4桁を4本の入力信号として直接入力する、等の使われ方がある。2進数(または16進数)で扱う場合と違い、表示素子に入力する前の変換が要らずデータバス上の信号をそのまま利用できるというメリットがある。
本来、コンピュータでは二進数で演算するのがコンピュータ資源(レジスタ、メモリ、計算量)の有効利用になる。それでも二進化十進数が有効な場合があるのは、二進数から十進数への変換を省略したときに得をする場面があるからである。つまり二進化十進数は純粋なコンピュータの問題ではなくて、十進数社会での社会的な価値があるだけのものである。コンピュータの能力が上がれば上がるほど、十進数への変換を必要としないというメリットより、数値どうしの演算に手間がかかるというデメリットのほうが大きくなり、計算には二進数を使ったほうがよくなる。
「社会的な価値」の具体例として、小数の丸め処理が挙げられる。小数 0.1 は十進数では有限桁で表記できるが、二進数では無限桁の循環小数となる。このため、入力値が十進数表現で有限桁の小数で定義されている場合に、二進数表現で丸め誤差を考慮せずに計算を進めると、十進数での演算では発生しなかった誤差が蓄積される可能性がある。例えば以下の Java プログラムを実行すると、double 型を使って 0.1 を 10,000 回加えた結果は 1,000.0 ではなく 1,000.0000000001588 となることがわかる。このような問題を避けるため、入力値や丸め処理が十進数で定義されている場合は、コンピュータ内の処理も二進化十進数で実装されることが少なくない。通貨を扱う事務アプリケーションなどが、しばしばこのケースに該当する。
public static void main(String[] args) { double sum = 0.0; for (int i = 0; i < 10000; i++) sum += 0.1; System.out.println("sum = " + sum); }