Closed7

CSAPP 浮動小数点数

bayamasabayamasa

昔浮動小数点計算は各メーカーが独自のものを採用していた。
それにより規格のズレがおこっていた。

IEEE 754によってそれは解消される。
この取り組みはIntelの資金援助を受けてはじまった。
今はほとんど全てのコンピューターがこの規格の採用をしている。

bayamasabayamasa

2または10を基数とする有限数。各有限数は、符号s(0または1)、仮数c、指数qの3つの整数で表現し、(−1)^s × c × b^qという値を意味する。
bは基数で2または10である。
例えば、符号が1(負数を意味する)、仮数が12345、指数が−3で、基数が10だった場合、−12.345という値を表す

bayamasabayamasa


このような表現にしているのは浮動小数点数同士の大小比較を容易にするためである。

bayamasabayamasa

偶数丸め
値が0.5で終わる場合に、最下位桁が偶数であるようにする丸め

モード $1.40 $1.60 $1.50 $2.50 $-1.50
偶数丸め $1 $2 $2 $2 $-2
bayamasabayamasa

なぜ偶数丸めを使用するのかというと統計的な偏りを避けるためである。
中央の値、つまり~.5のような値を一意に切り上げ/切り捨てを行ってしまうと、値に偏りができてしまう。

切り上げを行うと真値よりも高い値に、切り下げだと真値よりも低くなる。
このために偶数丸めをして、値によって丸める方向が50%で変わる方法を実践している。

bayamasabayamasa

この記事の補足というか自分が理解したときに考えたことメモ
https://note.com/ruiu/n/ndd60f403e8f2

浮動小数点の表現の範囲
表現の範囲は指数部によって定義される。
基本的に浮動小数点の表現方法は2^(指数部) * 仮数部のため、指数部が増加するに従って表現できない数値が存在する。

その前に表現の範囲のわかりやすい例として、整数を考えてみる。
例えば整数の場合、1の次は2となる。
このようなとき 2 - 1の差分 1の間にある数値は整数では表現できない。
具体的な数値でいうと、1.00001, 1.5 1.567896789 などは整数では表現できない。
これらの数値を整数で表現しようとすると丸めという法則に従って無理やり値が変更されてしまう。
例えば全て切り捨てだったら1.5 → 1, 1.9 → 1 といった具合である。

ここでコンピューターにおけるfloatの表現の範囲について考える。
指数部が2^22と2^23だった場合を例に考えてみる。
2^23の最小値と2^22最大値の差分が存在した場合、それらの値は表現できず丸められる。
指数部2^22のときの最大値のときのfloat仮数部の最大値は23bit全て1の場合である。
(floatの仮数部は23bitある)
指数部2^22のときの最大値は
a = 2^22 * (1 + (2^23 - 1)/2^23)

また指数部2^23のときの最小値は仮数部の最下位bitのみが1のときなので
b = 2^23 * (1 + 1/2^23)

計算するとわかるが b - a = 0.5となる。
これにより、指数部が22のときの最大値から指数部が23のときの最小値の値の間にある数は0~0.5存在するがこれらの値はfloatでは表現することができない。

このスクラップは2021/08/20にクローズされました