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
関連記事
- Built-in Types — Python v3.0.1 documentation float.hex()¶
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