Pythonのfloat型には、浮動小数点数の16進文字列を返してくれるhexメソッドが用意されています。
float.hexメソッドを使うと、十進法の「0.1」が十六進法だとどう表現できるかを以下のように確認できます。
>>> (0.1).hex()
'0x1.999999999999ap-4'
浮動小数点数の理解を深めるためには、二進法だとどのような表記になるのかも確認するほうが良さそうです。
floatを2進文字列にする関数
いくつかの実装方法を考えられますが、ここではfloat.hexメソッドを利用した関数をご紹介します。
n_hex = float_number.hex()
ret = '0b 1.'
for i in n_hex[4:17]:
ret += f'{int(i, 16):04b}' + ' '
return ret + n_hex[17:]
上記の関数を用意しておくと、以下のように10進数の「0.1」が、2進数だと「1001」が繰り返される循環小数になっていることを確認できます。
>>> float_to_bin(0.1)
'0b 1.1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1010 p-4'
floatを2進文字列にする関数で行っている処理
float_to_bin関数内では以下の処理を行っています。
16進文字列への変換
引数float_numberに指定された浮動小数点数を、folat.hexメソッドを使って16進文字列に変換して変数n_hexに代入しています。
n_hex = float_number.hex()
例えば「0.1」を引数に指定した場合であれば、文字列「0x1.999999999999ap-4」が代入されます。
戻り値の接頭辞と「1.」の代入
接頭辞「0b」と、戻り値の最初の「1.」の部分を変数retに代入です。
ret = '0b 1.'
2進文字列がズラズラと続くと読みづらいので、「0b」と「1.」の間に半角スペースを入れた文字列「0b 1.」を代入しています。
forブロックの開始
変数n_hexには「0x1.999999999999ap-4」といった文字列が代入されていますから、小数点「.」の直後4文字目から、16文字目(pの直前)までをfor文で処理します。
for i in n_hex[4:17]:
16進数を2進数に変換
forブロックの中では、十六進法の数字を二進法の数字に変換して、変数retに追記しています。
ret += f'{int(i, 16):04b}' + ' '
その際、拙著『Python入門を読み終えた人へ…1:文字列フォーマットの基本』でも解説しているf-stringで、ゼロ埋めされた4桁の2進文字列にし、半角スペースを追加しています。
代入演算子の右辺は、
f'{int(i, 16):04b}' + ' '
ではなく、
f'{int(i, 16):04b} ' # 末尾の「'」の直前には半角スペース
としてもかまいませんが、半角スペースを追加していることを明確にするために、あえて「+ ' '」を使っています。
戻り値の指定
forブロックを抜けたら、変数n_hexの17文字目以降、指数部を表す最後の「p-4」といった部分を付加して、戻り値にしています。
return ret + n_hex[17:]
最終更新日時:2024-01-03 10:54
- Newer:『Python入門を読み終えた人へ…1』の執筆時間は215時間
- Older:Pythonでサイコロの各目が出る確率を