浮動小数点型

2025/04/01に公開

【導入】

https://zenn.dev/417yr/articles/1e115bbb98e217

上記の記事にて、固定小数型のデメリットを以下のように記載しました。

0が連続する際でも浮動小数点型のように指数表記で短く表現することができない
→0に多くの桁数を割かなければならない
→表現できる値の範囲が狭い

ここで出てきた浮動小数点型について説明します。

【概要】

浮動小数点とは指数表記(またはE表記)によって小数点を動かすことのできる数値のこと
指数表記では数値を仮数 × 基数^{(指数)}として表現します。
仮数部のbit数が増えることでより高い精度で値を表現でき、
指数部のbit数が増えることでより広範囲の値を表現できます。

0が連続する場合、固定小数点型では0に多くの桁数を割かなければならない(0の個数分だけbitが必要)のに対し、
浮動小数点型では指数表記を用いて簡潔に表現できるので、限られた桁数(bit数)でも極端に大きい値/小さい値を表現できます。

指数表記例:4.17 × 10^{-26}
E表記例:4.17E-26 (または小文字 4.17e-26)

10進数4.375を2進数に変換した100.011を例とする
1.00011 × 10^{10}

【丸め誤差】

指数表記を用いることで表現できる数値の範囲は広いものの、bitパターンが足りないため数値を全て正確に表現することはできません。
そのため最も近い値に丸められます。
プログラミング言語で小数を扱う際には誤差に注意する必要があります。

上記double型を例とすると、指数表記を用いることで1.8 × 10^{308}のような極端に大きい値を表現できるのに、実際のbitパターンとしては2^{64}しかないので圧倒的に足りないことがわかります。

誤差が生じない小数

分母が2^nで表現できる10進数の小数は、2進数に変換したときに有限小数で表現できます。
(整数は分母が2^0=1であると捉えることができます)

【IEEE754】

浮動小数点型は全体の桁数(データ長)や、その中の仮数部と指数部のbit配分の違いなどで様々な形式があるが、IEEE754が標準規格として知られている。

IEEE754として4つの形式が定められており、
その中で実用上よく用いられるfloat型とdouble型について説明する。

float型

  • 32bitで表される単精度浮動小数点型
  • 表現できるおおよその範囲
    • -3.4 × 10^{38} から -1.2 × 10^{-38}
    • 0
    • 1.2 × 10^{-38} から 3.4 × 10^{38}
  • bit配分
    • 符号部:1bit
    • 指数部:8bit
    • 仮数部:23bit

double型

  • 64bitで表される倍精度浮動小数点型
  • 表現できるおおよその範囲
    • -1.8 × 10^{308} から -2.2 × 10^{-308}
    • 0
    • 2.2 × 10^{-308} から 1.8 × 10^{308}
  • bit配分
    • 符号部:1bit
    • 指数部:11bit
    • 仮数部:52bit

【補足】

正規化

例えば,「1234.5」を「1.2345×10^{3}」のように,小数点の位置を1番左の数値と左から2番目の数値の間に移動(「正規化」と呼ぶ)

有効数字

信頼できる値の桁数

【参考】

https://e-words.jp/w/浮動小数点数.html

https://www.risk.tsukuba.ac.jp/~takitoshi/tutorial/floating-point.html

https://e-words.jp/w/丸め誤差.html

Discussion