単精度浮動小数点数

単精度浮動小数点数とは



情報処理において、単精度浮動小数点数とは、数値をコンピュータ上で表現するための形式の一つです。特に、IEEE 754という規格で標準化されており、32ビット(4バイト)で数値を表現します。これは、倍精度浮動小数点数64ビット)と対比される概念であり、より少ないメモリで数値を扱える反面、精度が低くなるという特徴があります。

単精度浮動小数点数の歴史



かつては、システムにおける基本的な精度として、単精度浮動小数点数が使用されていました。初期のコンピュータでは、1ワード(コンピュータが一度に処理できるデータの単位)が32ビットであることが多く、その1ワードで表現できる実数が単精度とされていました。倍精度は、その倍の2ワードを使用していました。FORTRANなどの古いプログラミング言語では、整数型実数型が同じ語長を占めることを前提としていました。

しかし、時代が進むにつれて、より高精度な計算が求められるようになり、64ビット倍精度浮動小数点数が主流となっていきました。現在では、単精度浮動小数点数は、メモリ消費量を抑えたい場合や、それほど高精度な計算を必要としない場合に利用されています。

IEEE 754規格における単精度浮動小数点数



IEEE 754規格では、単精度浮動小数点数は `binary32` と正式に呼ばれています。この規格では、32ビットを以下の3つの部分に分けて数値を表現します。

符号ビット: 1ビット。数値の正負を表します。0が正、1が負を表します。
指数部: 8ビット。数値の大きさを表します。バイアス付きで表現され、0から255までの値を取ります。
仮数部: 23ビット。数値の有効桁数を表します。正規化された数では、暗黙の1があるものとして扱われるため、実質24ビットの精度を持ちます。

表現できる数値


これらのビットを組み合わせて、以下のような形式で数値を表現します。


(-1)^符号ビット (1.仮数部) 2^(指数部 - 127)


この形式により、非常に広範囲の数値を表現できます。

最小の正の非正規化数: 約 1.4 × 10^-45
最小の正の正規化数: 約 1.18 × 10^-38
表現可能な最大の数: 約 3.4 × 10^38

特殊な値


指数部が特定の値を取る場合、特別な意味を持ちます。

指数部がすべて0の場合: ゼロ、または非正規化数を表します。
指数部がすべて1の場合: 無限大、またはNaN(非数)を表します。

プログラミング言語における単精度浮動小数点数



多くのプログラミング言語では、単精度浮動小数点数を表す型が組み込まれています。C言語C++、C#、JavaHaskellでは `float` が、MATLABでは `single` が、PascalVisual 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 = (1100)2
2. 小数部: 0.375 = (0.011)2
3. 組み合わせ: 12.375 = (1100.011)2
4. 正規化: (1.100011)2 × 2^3
5. 指数: 3 + 127 = 130 = (10000010)2
6. 仮数部: 10001100000000000000000
7. 結果: 01000001010001100000000000000000 = 41460000H

単精度浮動小数点数の例



1: 3f800000H
-2: c0000000H
最大の正数: 7f7fffffH
0: 00000000H
-0: 80000000H
正の無限大: 7f800000H
負の無限大: ff800000H
1/3: 3eaa aaabH

単精度浮動小数点数から十進数への変換



単精度浮動小数点数を十進数に変換するには、ビット列を符号ビット、指数部、仮数部に分解し、以下の式に従って計算します。


n = (-1)^符号ビット (1.仮数部) 2^(指数部 - 127)


例: 41c80000H を変換する


1. ビット列: 0100 0001 1100 1000 0000 0000 0000 0000
2. 符号ビット: 0
3. 指数部: 10000011 = 131
4. 仮数部: 10010000000000000000000
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)で表現され、有効数字は10進数で6桁、指数は±63乗です。これは、10進数を誤差なく扱えるという利点がありましたが、演算速度が遅くなるという欠点がありました。

まとめ



単精度浮動小数点数は、メモリ効率と計算速度のバランスを考慮して選択される数値表現形式です。IEEE 754規格に基づいて標準化されており、多くのプログラミング言語でサポートされています。その仕組みを理解することで、より効率的なプログラミングが可能になります。MSX-BASICのように、独自の形式を採用している場合もあるため、注意が必要です。

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。