情報処理において、単精度
浮動小数点数とは、数値をコンピュータ上で表現するための形式の一つです。特に、
IEEE 754という規格で標準化されており、
32ビット(4バイト)で数値を表現します。これは、
倍精度浮動小数点数(
64ビット)と対比される概念であり、より少ないメモリで数値を扱える反面、精度が低くなるという特徴があります。
かつては、システムにおける基本的な精度として、単精度
浮動小数点数が使用されていました。初期のコンピュータでは、1
ワード(コンピュータが一度に処理できるデータの単位)が
32ビットであることが多く、その1
ワードで表現できる実数が単精度とされていました。倍精度は、その倍の2
ワードを使用していました。FORTRANなどの古い
プログラミング言語では、
整数型と
実数型が同じ語長を占めることを前提としていました。
しかし、時代が進むにつれて、より高精度な計算が求められるようになり、
64ビットの
倍精度浮動小数点数が主流となっていきました。現在では、単精度
浮動小数点数は、メモリ消費量を抑えたい場合や、それほど高精度な計算を必要としない場合に利用されています。
IEEE 754規格では、単精度
浮動小数点数は `binary32` と正式に呼ばれています。この規格では、
32ビットを以下の3つの部分に分けて数値を表現します。
符号ビット: 1
ビット。数値の正負を表します。
0が正、1が負を表します。
指数部: 8
ビット。数値の大きさを表します。バイアス付きで表現され、
0から255までの値を取ります。
仮数部: 23
ビット。数値の有効桁数を表します。正規化された数では、暗黙の1があるものとして扱われるため、実質24
ビットの精度を持ちます。
表現できる数値
これらの
ビットを組み合わせて、以下のような形式で数値を表現します。
(-1)^符号
ビット (1.仮数部) 2^(指数部 - 127)
この形式により、非常に広範囲の数値を表現できます。
最小の正の非正規化数: 約 1.4 × 1
0^-45
最小の正の正規化数: 約 1.18 × 1
0^-38
表現可能な最大の数: 約 3.4 × 1
0^38
特殊な値
指数部が特定の値を取る場合、特別な意味を持ちます。
指数部がすべて0の場合: ゼロ、または
非正規化数を表します。
指数部がすべて1の場合:
無限大、または
NaN(非数)を表します。
多くの
プログラミング言語では、単精度
浮動小数点数を表す型が組み込まれています。
C言語、
C++、C#、
Java、
Haskellでは `float` が、MATLABでは `single` が、
Pascalと
Visual Basic .NETでは `Single` がそれぞれ単精度
浮動小数点数を表します。
Pythonの `float` は倍精度であり、単精度はサポートされていません。F#では `float32` または `single` が単精度、`float` または `double` が倍精度を表します。
十進数を単精度
浮動小数点数に変換する手順は以下の通りです。
1. 十進数を整数部と小数部に分けます。
2. 整数部を二進数に変換します。
3. 小数部を二進数に変換します。小数部に2をかけ、整数部を取り出す操作を繰り返します。
4. 二進数の整数部と小数部を組み合わせます。
5. `1.xxxx...` の形式になるように、シフトします。シフトした回数が指数になります。
6. 指数にバイアス(127)を加えます。
7. 符号
ビット、指数部、仮数部を組み合わせて、
32ビットの
ビット列を作ります。
例: 12.375 を変換する
1. 整数部: 12 = (11
00)2
2. 小数部:
0.375 = (
0.
011)2
3. 組み合わせ: 12.375 = (11
00.
011)2
4. 正規化: (1.1
00011)2 × 2^3
5. 指数: 3 + 127 = 13
0 = (1
000001
0)2
6. 仮数部: 1
00011
00000000000000000
7. 結果:
01
000001
01
00011
00000000000000000 = 4146
0000H
1: 3f8
00000H
-2: c
0000000H
最大の正数: 7f7fffffH
0:
00000000H
-
0: 8
0000000H
正の
無限大: 7f8
00000H
負の
無限大: ff8
00000H
1/3: 3eaa aaabH
単精度
浮動小数点数を十進数に変換するには、
ビット列を符号
ビット、指数部、仮数部に分解し、以下の式に従って計算します。
n = (-1)^符号
ビット (1.仮数部) 2^(指数部 - 127)
例: 41c80000H を変換する
1.
ビット列:
01
00 0001 11
00 1
000 0000 0000 0000 0000
2. 符号
ビット:
0
3. 指数部: 1
0000011 = 131
4. 仮数部: 1
001
0000000000000000000
5. 本来の指数: 131 - 127 = 4
6. 本来の仮数: 1 +
0.5 +
0.
0625 = 1.5625
7. 結果: 1.5625 × 2^4 = 25
MSX-BASICにおける単精度浮動小数点数
MSX-BASICでは、単精度
浮動小数点数を4バイトで表現しますが、
IEEE 754とは異なる独自の形式を使用しています。符号
ビットが1
ビット、指数部が7
ビット(バイナリ)、仮数部が24
ビット(BCD)で表現され、有効数字は1
0進数で6桁、指数は±63乗です。これは、1
0進数を誤差なく扱えるという利点がありましたが、演算速度が遅くなるという欠点がありました。
まとめ
単精度
浮動小数点数は、メモリ効率と計算速度のバランスを考慮して選択される数値表現形式です。
IEEE 754規格に基づいて標準化されており、多くの
プログラミング言語でサポートされています。その仕組みを理解することで、より効率的なプログラミングが可能になります。MSX-BASICのように、独自の形式を採用している場合もあるため、注意が必要です。