Yabu.log

ITなどの雑記

IEEE754について。モダンなコンピュータはどのように少数を扱っているのか

IEEE754とは

小数の計算性能と移植性改善のために制定された。おそらく現代のほとんどのコンピュータや言語処理系が採用している少数を扱うときの規格。

値の表現方法について

その表現は符号部(sign)、指数部(exponent)、仮数部(fraction)に分けられる

f:id:yuyubu:20181008234719p:plain

value start end length
sign 31 31 1
exponent 23 30 8
fraction 0 22 23

画像の出典:https://en.wikipedia.org/wiki/IEEE_754-1985

それぞれを組み合わせて以下のように少数を表現している

(-1)sign * (1 + fraction) * 2exponent-127

sign bitを符号の有無に利用している点はシンプルだが、仮数部および指数部は 1を足したり127を引いたりしていてややこしく、初見では理解しがたいため解説を後述する

仮数部はなぜ1を足しているのか。

これは科学的表記法を2進数に適応した場合を考えるとわかりやすい。

7.5025 + 102 = 750.25

これが科学的表記法。凡例は

m * 10n ただし 0 <= m < 1

これを2進数に適応すると

1.01110111001 * 29 = 1011101110.01

となる。

2進で表現した小数は表現する数値が0以外の場合、科学的表記法に直すと仮数部の左端は必ず1になる。以下に適当な例をあげる

10進数 2進数 科学的表記法
0.75 0.11 1.1 * 2^ -2
12.5 1100.1 1.1001 * 2^ -3
33.25 100001.01 1.0000101 * 2^ -5

IEEE754ではこちらを省略するようになっている

IEEE754では,正規化された2進数の先頭の1を仮数フィールドの中で直接持たないようにした.したがって,仮数の実際の長さは,単精度では24ビットであり,倍精度では53ビット(1+52)である.正確を期す場合には,頭に1を付けた24まビットの数値を指して“significand”という用語を使用し,23ビットの数値を指して“fraction”という用語を使用する.0には前に1が付かないので,ハードウエアが1を付加しないようにするために,特定の値が予約されている.

コンピュータの構成と設計 3.5章 浮動小数点演算より抜粋(補足:倍精度小数点に関する記述を省いてある)

※予約されている特定の値は単精度浮動小数点の場合はオール0である

浮動小数点数の表現で省略した1を+1して戻すことで実際の値としている。

指数部はなぜ127を引いているのか

これはゲタばき表現、と呼ばれるものであり数値比較を単純にするために

  • 00000000の状態を最小値に(2^ -127)にしたい
  • 11111111の状態を最大値に(2^ 128)にしたい

という目標がある。ので8進数で0~255の値を計算した後、そこから127を引いてcの値に変換する。 この操作をゲタばき(バイアス)という。

最も小さな負の指数を00...00と表し,最も大きな正の指数を11...11と表すような,表記法を用いることが望ましい.それをゲタばき表現(biasedrepresentation)と呼ぶ.ゲタばき表現をとる際に,実際の値を得るために,通常の符号なしの表現から引く数値をゲタ(bias)という.

コンピュータの構成と設計 3.5章 浮動小数点演算より抜粋

まとめ

  • 最上位ビット(31ビット目)は0で整数、1で負数の符号を表す
  • 仮数部では科学的表記法の2進数表現と同じ考え方だが、最上位ビットになる「1」を省略する
  • 指数部ではゲタばき表現を使って-127~128を表現する

コンピュータの構成と設計 第5版 上・下電子合本版

コンピュータの構成と設計 第5版 上・下電子合本版