二進化十進表現
二進化十進数 (BCD、Binary-coded decimal ) とは、コンピュータにおける数値の表現方式の一つで、十進法の1桁を、0から9までを表す二進法の4桁で表したものである。「二進化十進符号」などとも呼ばれる。3増し符号など同じ目的の他の方式や、より一般的に、十進3桁を10ビットで表現するDensely packed decimalなども含めることもある。
概要
一般に二進法の4桁(ニブル)は、0から15までの整数を表すことができる。二進化十進法ではこのうちの最初の10個を有効な数値として扱う。
十進法 | BCD表現 |
---|---|
0 | 0000 |
1 | 0001 |
2 | 0010 |
3 | 0011 |
4 | 0100 |
5 | 0101 |
6 | 0110 |
7 | 0111 |
8 | 1000 |
9 | 1001 |
例えば、127 という整数値は、 0001、0010、0111 という3つのBCDで表される。
二進化十進数には、ゾーン形式とパック形式があり、用途に応じて使い分けられる。
符号部を持たないパック形式では、ファイルなどの中の二進化十進数値を十六進法で表示すると十進と同じように表示される。例えば、十六進で「1234」と表示されるデータは、整数値 1234 のことである。また、機種や文字コードに依存するものの、一般にゾーン形式では8ビット文字表示すると十進と同じように表示される。ただし、符号部を持つ場合も多く、上記の表示が必ずしもわかりやすいとは言えないこともある。
簡単な利用法としては、電子回路上で、0 - 9を表示可能なBCD対応の数字表示素子1つに対してBCDの4桁を4本の入力信号として直接入力する、等の使われ方がある。二進法で扱う場合と違い、表示素子に入力する前の変換が要らずデータバス上の信号をそのまま利用できるというメリットがある。
二進法で計算を行う多くのコンピュータでは、二進化十進表現を使用する機能(または、計算結果を補正するための機能)を備えている。
本来、コンピュータでは二進法で演算するのがコンピュータ資源(レジスタ、メモリ、計算量)の有効利用になる。それでも二進化十進数が有効な場合があるのは、二進法と十進法との変換を回避することに「社会的な価値」があるからである。つまり二進化十進数は純粋なコンピュータの問題ではなく、十進法社会という現実からの要請による。
「社会的な価値」の具体例として、小数の丸め処理が挙げられる。0.1 のような値は十進法では有限桁で表記可能だが、二進法では無限桁の循環小数となる。このため、一般的な二進法の浮動小数点数演算では 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);
}
このような問題を避けるため、処理対象の値が十進の場合は、コンピュータ内の処理も二進化十進数で実装されることが少なくない。通貨を扱う事務アプリケーションなどが、しばしばこのケースに該当する。
なお、10.0 / 3.0 を計算する時には全く何も変わらない同様の問題を十進でも抱えている。このようなケースでは、二進化十進数でも正確に表す事はできない。
デ=ジュレ標準による標準化の要請が根強く存在していることもあって、浮動小数点表現の標準であるIEEE 754に2008年の改訂で十進浮動小数点が追加された。これには、より効率の良い Densely packed decimal(DPD)方式が採用された。