18.3.3 浮動小数点表現の精度・範囲と特別な値

浮動小数点表現で表せる数の精度や,特別な値の表現を調べましょう.

浮動小数点の精度

既に前節 hwb18.3.2 浮動小数点表現 で見たように,浮動小数点表現では,ほとんどの 10 進小数を近似的にしか表すことができません.その数値の精度は仮数部の桁数で決まります.また,指数部の桁数は表現可能な数値の範囲に影響します.IEEE 754 の単精度浮動小数点数を例に,精度と桁数を調べてみましょう.

まず前節で説明した,(通常の)浮動小数点表現の定義を思い出しておきます.

数値 = (−1)符号部×(1.仮数部)×2指数部−bias

単精度では仮数は 23 ビット使うので,仮数部の取る値は次のいずれかになります.

1.00…00(2) = 1
1.00…01(2) = 1+2-23 ≒ 1+1.2×10-7
1.00…10(2) = 1+2-22 ≒ 1+2.4×10-7
:
1.11…11(2) = 2-2-23 ≒ 2-1.2×10-7

このことから単精度の精度は高々 24 ビット,10 進数で 7 桁程度しかないことが分かります.一方 IEEE 754 では,指数のビット列が全て 0 または 1 となった場合,通常の数ではないものを意味します.ですので,仮数部が取り得る値の範囲は次のようになります.

200000001(2)-127 = 2-126 = 1.2×10-38
:
211111110(2)-127 = 2127 = 1.7×1038

つまり,単精度で表現できる普通の数値(正規化数)の範囲は,最小値が 2-126 ≒ 1.2×10-38, 最大値が (2-2-23)×2127 ≒ 2128 ≒ 3.4×1038 となります.表そうとした数の絶対値が単精度の表現範囲の最大値を超えることをオーバーフロー (overflow) と呼び,最小値を下回ることをアンダーフロー (underflow)と呼びます.

ちなみに倍精度の場合,その精度は 53 ビット,10 進数の 16 桁程度になります.また,オーバーフロー限界は 21024 ≒ 1.8×10308,アンダーフロー限界は 2-1022 ≒ 2.2×10-308 になります.

特別な値

IEEE 754 では,通常の数値以外に特別な意味をもつ数が定義されています.以下では単精度浮動小数点表現の場合でビット表現を説明します(見易くするために 8 ビットごとに空白を入れています).

ゼロ

ゼロは,指数部のビットが全て 0 で,仮数部のビットも全て 0 のものとして表現されます.
細かく言うと 0 (+0) と −0 の区別があります.

00000000 00000000 00000000 00000000: 0
10000000 00000000 00000000 00000000: −0

この区別は,1/0 のようなゼロで割ったときに効いてきます.1/0 は +∞ ですが,1/(−0) は −∞ になります.

非正規化数

指数部のビットが全て 0 (つまり指数部が 0)で,仮数部が 0 以外のものは非正規化数といい,通常の正規化数と 0 の間のギャップを埋める数となります.具体的には,

数値 = (−1)符号部×(0.仮数部)×21−bias

という数を表します.

例えば,最小の正の正規化数は,指数部が 1,仮数部が 0 であるため,

00000000 10000000 0000000 0000000

というビット列で表され,表現する値は前に書いたように 2-126 ≒ 1.17549435×10-38 となります.

一方,最大の正の非正規化数は,指数部が 0,仮数部のビットが全部 1 となる

00000000 01111111 11111111 11111111

というビット列で表され,その値は (1-2-23)2-126 ≒ 1.17549421×10-38 となります.また,最小の正の非正規化数は,指数部が 0,仮数部が 1 となる

00000000 00000000 00000000 00000001

というビット列で表され,その値は 2-23 × 2-126 ≒ 1.40129846×10-45 となります.

無限大 (∞)

指数部のビットが全て 1 で,仮数部のビットが全て 0 なものは無限大 (∞) です.符号部によって,正負の区別があります.

01111111 10000000 00000000 00000000: +∞
11111111 10000000 00000000 00000000: −∞

±∞ に 0 でない有限の数を足しても結果は変わりません.±∞ × 0, ∞ + (−∞) は次に説明する非数 (NaN) となります.

非数 (NaN)

指数部のビットが全て 1 で,仮数部のビットのどこかが 1 になっているものは非数 (NaN, Not a Number) です.
そのため,NaN を表すビット表現はたくさんありますが,例えば次のようなものがあります.

11111111 11000000 00000000 00000000: NaN の例

NaN は,0 / 0, ±∞ × 0, ∞ + (−∞) などの四則計算で発生します.

単精度浮動小数点数のまとめ

種類 Exp(指数部) Fraction(仮数部)
ゼロ 0 0
非正規化数 0 0以外
正規化数 1〜254 任意
無限大 255 0
NaN 255 0以外の任意