header image

枝折

固定小数点数と浮動小数点数について

CS

CREATED: 2026 / 05 / 07 Thu

UPDATED: 2026 / 05 / 07 Thu

固定小数点数と浮動小数点数の違い、IEEE 754 のフォーマット、バイアス表現、丸め誤差について整理してみました。

固定小数点数とは

固定小数点数(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.5e31.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.10.3 は正確に表現できないため、浮動小数点数に変換した時点でわずかな誤差が生じます。

丸め誤差について

浮動小数点数は有限のビット幅で数を表現するため、表現しきれない値は丸め(rounding) が発生します。 これが 丸め誤差(rounding error) の原因です。

有名な例として、多くのプログラミング言語で次のような計算結果になります。

0.1 + 0.2 = 0.30000000000000004

0.10.2 がそれぞれ 2 進浮動小数点数で正確に表現できず、わずかな誤差を持つためです。

丸め誤差を避けたい場面では、次のような対策が取られます。

  • 整数で計算する:金額計算では円単位・セント単位のまま整数で扱います。
  • Decimal 型を使う:Python の decimal モジュールや Java の BigDecimal など、10 進小数を正確に扱えるライブラリを利用します。
  • 許容誤差で比較する:浮動小数点数の等値比較では |a - b| < ε のように行います。

を仕舞い

参考資料📕