Python はじめました:float.hex

Python.use(better) # Python はじめました記事一覧
float.hex

《著》小粒ちゃん+α《監修》小泉ひよ子とタマゴ倶楽部
第0版♪2001/03/02 ● 第1版♪2003/05/25 ● 第2版♪2004/06/01 ● 第3版♪2009/02/28

関連記事

float.hex〈Python 3.0 版〉

>>> print(float.hex.__doc__)
float.hex() -> string

Return a hexadecimal representation of a floating-point number.
>>> (-0.1).hex()
'-0x1.999999999999ap-4'
>>> 3.14159.hex()
'0x1.921f9f01b866ep+1'

メソッド hex を利用すると、任意の float を16進数で表現した文字列が得られます。それが有限の浮動小数点数なら、'0x' で始まり、'p' に続く指数部で表現されます。これは、10進数 15 を16進数で表現した 'e' との混乱を避けるためです。

def ex_hex():
    for e in range(5):
        X = '{0}.hex()'.format(2.0**e)
        print(">>>",X)
        eval(compile(X,"_","single"))
    print(LINE)
    for e in range(1,16):
        X = '{0:g}.hex()'.format(e+e/16)
        print(">>>",X)
        eval(compile(X,"_","single"))

その動作(仕様)を確認すると、

>>> ex_hex()
>>> 1.0.hex()
'0x1.0000000000000p+0'
>>> 2.0.hex()
'0x1.0000000000000p+1'
>>> 4.0.hex()
'0x1.0000000000000p+2'
>>> 8.0.hex()
'0x1.0000000000000p+3'
>>> 16.0.hex()
'0x1.0000000000000p+4'

2.0 のベキ乗に対応して、指数部の値がひとつずつ増えているのが分かります。さらに、

# ----------------------------------------
>>> 1.0625.hex()
'0x1.1000000000000p+0'
>>> 2.125.hex()
'0x1.1000000000000p+1'
>>> 3.1875.hex()
'0x1.9800000000000p+1'
>>> 4.25.hex()
'0x1.1000000000000p+2'
>>> 5.3125.hex()
'0x1.5400000000000p+2'
>>> 6.375.hex()
'0x1.9800000000000p+2'
>>> 7.4375.hex()
'0x1.dc00000000000p+2'
>>> 8.5.hex()
'0x1.1000000000000p+3'
>>> 9.5625.hex()
'0x1.3200000000000p+3'
>>> 10.625.hex()
'0x1.5400000000000p+3'
>>> 11.6875.hex()
'0x1.7600000000000p+3'
>>> 12.75.hex()
'0x1.9800000000000p+3'
>>> 13.8125.hex()
'0x1.ba00000000000p+3'
>>> 14.875.hex()
'0x1.dc00000000000p+3'
>>> 15.9375.hex()
'0x1.fe00000000000p+3'

任意の浮動小数点数を16進数で表現した文字列が得られます。ここで、最後の例に着目すると、

>>> float.fromhex('0x1.e000000000000p+3')
15.0
>>> float.fromhex('0x0.1e00000000000p+3')
0.9375

になるので、これらを加えた 15.0+0.9375 の値を16進数で表現すると、0x1.e+0x0.1e つまり 0x1.fe になるのが分かります。

Last updated♪09/03/29