浮動小数点数デコーダへの道

目次

浮動小数点数の16進数表記を見てどれくらいの値かを知りたくなることがありますよね.
そのために知っておくと便利なことなどをまとめておこうかと思います.

浮動小数点数の基礎

学校で計算機関係の講義を取ったりIPAの試験を受けようとすると必ず出てくる話です.
小数は広く使われている計算機の中では浮動小数点数という形で扱われています.
浮動小数点数を構成する部分は3つあって,「符号部」「指数部」「仮数部」と日本語では呼ばれています.
例えばIEEE 754 binary64,いわゆる倍精度浮動小数点数では最上位ビットから1bit,11bit,52bitの計64bitとなっています.
これでどうやってある数Aを表すかというと,0以外であれば

|A| = 0x1[仮数部] x 2^{指数部 - bias}
となります.
符号は符号部が1なら負です.
biasがあることで絶対値が1未満の数も表せるようになっています.
biasは定数です.
仮数部はケチ表現ですね.
0以外の数の2進数の最上位ビットは必ず1になるため省略するやつです.

覚えておくといいこと

1

1は覚えておきましょう.
1を覚えておくと指数部のbiasが分かります.
16進数 bias
binary64
0x3ff0000000000000 0x3fff = 1023
binary32 0x3f800000 0x3f8 >> 3 = 0x7f = 127
binary16 0x3c00
0x3c >> 2 = 0xf = 15

biasを求めるには0でない部分を切り出して最下位ビットが1になるまでシフトすればいいです.

符号部

符号部に1が立つということは最上位4bitの最上位ビットに1が立つということです. 例えばFP64では
 1 = 0x3ff0000000000000
-1 = 0xbff0000000000000
となります.

常識的な最上位4bit

(少なくとも私の)常識の範囲内の数は絶対値がいたずらに大きかったり小さかったりしないため,binary64では0x3,0x4,0xb,0xcから始まる数の羅列を見たらいい感じの浮動小数点数列だーなんて思うわけです.

扱っいる数の大体の範囲の端

扱っている数の絶対値が1/32 ~ 32 に多いのであれば,例えばbinary64では
1/32 = 0x3fa0000000000000
  32 = 0x4040000000000000
を覚えておくと読みたい数の大きさをやんわりと捉えられるかもしれないです.

C++で簡単 FP64 <> hex Encoder/Decorder

おわりに

現在目で16進数表記の浮動小数点数を読む修行中なのでこれくらいしかかけませんが,他に有用な情報があれば是非教えていただけたらと思います.
なんか,逆に16進表記もできるようになってきた気がします... .

カテゴリー:その他
記事作成日:2019-08-17