読者です 読者をやめる 読者になる 読者になる

浮動小数点型のメモ

浮動小数点型についての個人的メモです。大学のレポートに出てきて、応用情報技術者試験にも必要なので、ちょっとまとめてみます。

  • コンピュータは実数を浮動小数点型で表す
    • 浮動小数点型には32bit単精度と64bit倍精度がある
      • C言語では、float型が32bit単精度、double型が64bit倍精度
    • 浮動小数点型では、符号、仮数、基数、指数の4つの部分で実数を表す
      • (符号) * (仮数) * (基数) ^ (指数)
      • コンピュータの場合、内部的に2進数が使われるので、基数は2になる
      • ビットの幅
        • 32bit単精度の場合
          • 符号部 1, 指数部 8, 仮数部 23
        • 64bit倍精度の場合
          • 符号部 1, 指数部 11, 仮数部 52
      • 符号部
        • 0と1で実数の正負を表す
        • 0なら正またはゼロ、1なら負
      • 仮数
        • 実数の絶対値を2進数で表して、一の位が1で残りは小数点以下になるように指数を加減し、一の位を除く小数点以下を仮数部とする(正規化)
        • ビットの幅が足りていない場合は、足りない分だけ0を右に付け加える
      • 指数部
        • イクセス表現、または2の補数で表される
          • イクセス表現
            • 正規化した時の指数に、ある定数を加えて指数部とする
            • 指数部が負にならないようにして、比較を単純にしている
10進数を浮動小数点型で表現する

例えば、-0.375(10進数)を32bit単精度浮動小数点型で表現してみます。符号部1bit、指数部8bit、仮数部23bitで、指数部は2の補数で表現します。

  • まず符号を分割する
    • 負の数なので、符号部は1
  • 絶対値を2進数で表現する
    • 0.375 (10進数) = 0.011 (2進数)
  • 一の位が1で残りは小数点以下になるようにする
    • 0.011 = 1.1 * 2 ^ (-2)
  • 小数点以下を仮数部とし、ビットの幅(23bit)に足りない分だけ0を右に付け加える
    • 仮数部 11000000000000000000000
  • 正規化した時の指数-2を2の補数で表し、指数部とする
    • 2を8bitの2進数で表し、ビット反転した後、1を加える
      • 00000010 → 11111101 → 11111110
    • 指数部 11111110
  • 符号部、指数部、仮数部の順に左からつなげる
    • 11111111011000000000000000000000