floatやdoubleの表現と精度
specIEEE754で標準化されている浮動小数点の仕様。
符号と指数部(exponent)と仮数部(fraction)からなるデータ構造で ± (基数)^(指数部) * 1.(仮数部) の値を表現する。 以下では基数を2とする。
例えばfloat(32bits)で-5.25を表す場合、まず2進数に変換して(-101.01)、± 2^n * 1.xxxx の形になるように小数点をずらす(- 2^2 * 1.0101)。その後、指数部のレンジを1-254にするため127を足した結果、 1(-) 10000001(2+127) 01010000000000000000000(.0101) となる。
ただし、指数部が0のときは ± 2^-126 * 0.(仮数部) として扱い、絶対値が極端に小さい非正規数も表すことができるようになっている。 また、指数部が255のとき、仮数部が0ならInfinity、そ例外はNaNとなる。
精度は仮数部の大きさに依存し、floatが10進数で Math.log10(2 ** 23) = 6.92 桁で、doubleが Math.log10(2 ** 52) = 15.65 桁。JavaScriptの数値はdoubleなので 1234567890.1234569 が 1234567890.123457 になり16~17桁目で値がおかしくなることが確認できる。