当サイトの一部ページには、アフィリエイト・アドセンス・アソシエイト・プロモーション広告を掲載しています。

Amazonのアソシエイトとして、Security Akademeiaは適格販売により収入を得ています。

広告配信等の詳細については、プライバシーポリシーページに掲載しています。

消費者庁が、2023年10月1日から施行する景品表示法の規制対象(通称:ステマ規制)にならないよう、配慮して記事を作成しています。もし問題の表現がありましたら、問い合わせページよりご連絡ください。

参考:令和5年10月1日からステルスマーケティングは景品表示法違反となります。 | 消費者庁

ミジンコでもわかる小数表現

本記事は随時更新して、ブラッシュアップしていきます。

固定小数点数 vs. 浮動小数点数

固定小数点数

固定小数点数(fixed point numberとは、有理数の表現方法の1つであり、小数点が置かれる桁を固定して表された数のことです。

浮動小数点数

浮動小数点数(floating point number)とは、有理数の表現方法の1つであり、次の形式で表現される数です。

$$a \times b^e$$

ここで、aは仮数(mantissa)、bは基数(cardinal number)、eは指数(exponent)と呼ばれます。

それぞれの例

  • 固有小数点表示:0.0025
  • 浮動小数点表示:0.25×10-2
    • 上記の例では、仮数a=0.25、基数b=10、指数e=-2である。

浮動小数点数の正規化

ある数があったとします。このとき浮動小数点表示の形式が決まっていた場合、いくつかの表現方法があります。

例えば、固有小数点表示で「0.0025」と表現できる数値を、浮動小数点表示すると次のように書き換えられます。

  • 0.025×10-1
  • 0.25×10-2
  • 2.5×10-3

いずれも同じ値であることに着目してください。

しかし、浮動小数点数の表示形式における仮数部の先頭を0で埋めてしまうと、仮数で表現できる桁数が減ってしまいます。

そこで「0.XY…」のような形[1]「X.Y…」のタイプもあります。にしたほうが、表現できる数が増えてよいといえます。

この変換操作を正規化といいます。

つまり、正規化とは、仮数が定められた範囲内に入るように、指数と仮数を調整することです。

よく登場する浮動小数点表示

16ビットを浮動小数点数にすると、表示形式は次のようになります。

  • S:仮数部の符号(正は0,負は1)
  • E:2のべき乗の指数部。負数は2の補数。
  • M:仮数部の絶対値
  • 正規化は0.1X…

[例]10進数の「0.375」(=2進数で「0.011」)をこの形式で浮動小数点表示して、正規化すると、次のような16ビット列になります。

IEEE 754の浮動小数点表示

IEEE 754では、$(-1)^{S} \times 1.M \times 2^{e+M}$という形式で有理数を符号化します。

$1.M$は2進数の小数点数表記になります。

たとえば、2進数の1.101bは、10進数の1.625(=1+1/2+1/8)と等しくなります。

Sは符号を表し、S=0なら正の数、S=1なら負の数になります。

Mは次の定数です。

  • 32ビット浮動小数点数の場合は、M=127
  • 64ビット浮動小数点数の場合は、M=1023

ここでは、32ビット浮動小数点数の表示形式は次のとおりです。

  • 符号部:1ビット
  • 指数部:8ビット
  • 仮数部:23ビット

$$(-1)^{S} \times 1.M \times 2^{E}$$

$$(-1)^{S} \times 1.M \times 2^{e+127}$$

  • S:仮数部の符号(正は0,負は1)
  • E:2のべき乗の指数部に関係する値。指数Eはe+127と一致する。
  • M:仮数部の絶対値
  • 正規化は1.X…

[例]-0.15626(=-(1/8+1/32))=-0.00101b=-1.01×2-3をIEEE 745形式で32ビット浮動小数点表示してみます。

  • 負の数なので、符号S=1b
  • 指数Eは、E=e+127=-3+127=124=0111 1100b
  • 仮数Mは、M=010 0000 0000 0000 0000 0000b

よって、次のような32ビット列になります。

指数が255の場合

[1]「指数が255」かつ「仮数が0」のとき、無限大を表します。

0以外の数値を0で割ると無限大となります。

[2]「指数が255」かつ「仮数が0以外」のとき、数値ではないことを意味するNaN(Not a Number)を表します。

0を0で割るとNaNになります。

References

References
1 「X.Y…」のタイプもあります。

情報数学

Posted by ipusiron