固定小数点数と浮動小数点数について
CREATED: 2026 / 05 / 07 Thu
UPDATED: 2026 / 05 / 07 Thu
固定小数点数とは
固定小数点数(fixed-point number) は、小数点の位置があらかじめ決まった数値表現です。
例えば 8 ビットで整数部 4 ビット・小数部 4 ビットと決めた場合、00101011 は次のように解釈されます。
整数部: 0010 = 2
小数部: 1011 = 0.5 + 0.125 + 0.0625 = 0.6875
→ 2.6875
回路が単純で処理が高速な反面、表現できる範囲と精度がビット幅で固定されます。 非常に大きな数と非常に小さな数を同時に扱うことが苦手です。
浮動小数点数とは
浮動小数点数(floating-point number) は、小数点の位置を動かすことで広い範囲の数を表現します。
10 進数の科学的記数法(例:1.23 × 10^4)の 2 進数版です。
現代のコンピュータでは IEEE 754 規格に基づく浮動小数点数が広く使われています。
単精度浮動小数点数と倍精度浮動小数点数
IEEE 754 では主に次の 2 種類が定義されています。
| 種別 | ビット数 | 符号部 | 指数部 | 仮数部 |
|---|---|---|---|---|
| 単精度(float) | 32 ビット | 1 ビット | 8 ビット | 23 ビット |
| 倍精度(double) | 64 ビット | 1 ビット | 11 ビット | 52 ビット |
倍精度は単精度より広い範囲と高い精度を持ちますが、メモリ使用量は 2 倍になります。
IEEE 754 のフォーマット
符号部・指数部・仮数部
浮動小数点数は 3 つのフィールドで構成されます。
- 符号部(sign bit):0 が正、1 が負を表します。
- 指数部(exponent):2 を基数とする指数を、バイアス表現で格納します(後述)。
- 仮数部(mantissa):有効数字の小数部分を格納します。
32 ビット単精度の場合、ビット配置は次の通りです。
[符号部 1bit][指数部 8bit][仮数部 23bit]
正規化
IEEE 754 では、仮数部を 正規化(normalized) した形で格納します。
正規化とは、値を 1.xxxxx × 2^e の形に変換することです。
整数部の 1 は常に固定されるため格納しません(暗黙の 1(implicit leading 1))。
これにより、23 ビットの仮数部で実質 24 ビット分の精度を得られます。
例:13.625 を単精度浮動小数点数で表現します。
整数部: 13 = 1101(2)
小数部: 0.625 = 0.101(2)
13.625 = 1101.101(2)
= 1.101101 × 2^3 ← 正規化
符号部: 0(正)
指数部: 3 + 127(バイアス値)= 130 = 10000010(2)
仮数部: 10110100000000000000000(101101 に 0 を補って 23 ビット)
指数部のバイアス表現
マイナスを表現する仕組み
指数部は 2 の補数ではなく、バイアス表現(biased exponent) を使います。 バイアス値を加えて格納することで、指数を常に非負の整数として扱えます。
格納値 = 実際の指数 + バイアス値
実際の指数 = 格納値 − バイアス値
| 精度 | バイアス値 | 指数の実際の範囲 |
|---|---|---|
| 単精度 | 127 | -126 〜 +127 |
| 倍精度 | 1023 | -1022 〜 +1023 |
(0 と最大値は特殊値として予約されているため、使える実際の範囲は上記の通りです)
2の補数表現との違い
2 の補数と比較すると、用途と仕組みが異なります。
| 特性 | 2の補数表現 | バイアス表現 |
|---|---|---|
| 主な用途 | 整数の負数表現 | 浮動小数点数の指数部 |
| 負数の表し方 | ビット反転 + 1 | 格納値 − バイアス値 |
| ハードウェア比較 | 符号を考慮する必要 | 整数として直接比較可能 |
バイアス表現が指数に採用される理由は、格納値をそのまま符号なし整数として比較できるためです。 浮動小数点数の大小比較を、符号部・指数部・仮数部を含むビット列の整数比較で行えます。
2の補数表現とバイアス表現
前の記事で扱った 2 の補数とバイアス表現は、どちらも負の数を扱う仕組みですが、利用される場所が異なります。
- 2の補数表現:CPU の汎用レジスタや整数演算(ALU)で使われます。加算だけで減算を実現できるためハードウェアが簡素になります。
- バイアス表現:IEEE 754 の浮動小数点数の指数部で使われます。指数同士の比較を符号なし整数として高速に行えます。
バイアス値は 2^(指数部ビット数 - 1) - 1 で決まります。
単精度では 2^(8-1) - 1 = 127、倍精度では 2^(11-1) - 1 = 1023 です。
Decimal(10進小数)
指数表現 e
プログラミングでは、浮動小数点数の指数表記として e(または E)が使われます。
1.5e3 は 1.5 × 10^3 = 1500 を意味します。
1.5e3 → 1500.0
3.0e-2 → 0.03
6.02e23 → 6.02 × 10^23(アボガドロ定数など)
2進小数と10進小数の整理
前の記事(基数変換)でも触れましたが、10 進小数のすべてが有限の 2 進小数で表せるわけではありません。
0.5(10) = 0.1(2) ← 有限で表現可能
0.25(10) = 0.01(2) ← 有限で表現可能
0.1(10) = 0.00011001100110011...(2) ← 無限循環小数
0.3(10) = 0.01001100110011001...(2) ← 無限循環小数
有限の 2 進小数で表せる 10 進小数は、分母が 2 の冪乗(2, 4, 8, 16, …)で割り切れる数のみです。
0.1 や 0.3 は正確に表現できないため、浮動小数点数に変換した時点でわずかな誤差が生じます。
丸め誤差について
浮動小数点数は有限のビット幅で数を表現するため、表現しきれない値は丸め(rounding) が発生します。 これが 丸め誤差(rounding error) の原因です。
有名な例として、多くのプログラミング言語で次のような計算結果になります。
0.1 + 0.2 = 0.30000000000000004
0.1 と 0.2 がそれぞれ 2 進浮動小数点数で正確に表現できず、わずかな誤差を持つためです。
丸め誤差を避けたい場面では、次のような対策が取られます。
- 整数で計算する:金額計算では円単位・セント単位のまま整数で扱います。
- Decimal 型を使う:Python の
decimalモジュールや Java のBigDecimalなど、10 進小数を正確に扱えるライブラリを利用します。 - 許容誤差で比較する:浮動小数点数の等値比較では
|a - b| < εのように行います。
を仕舞い
参考資料📕