根據@Hannes Karppila的回答,這裏有兩個函數,它們以二進制和十六進制格式顯示任意數字的機器表示。它使用與答案基本相同的邏輯,但用零填充輸出以顯示每個字節的「正確」長度。
import ctypes
import decimal
def print_as_octave_bit_hex(x):
'''
This function prints the binary representation as it would
be printed using the format 'bit' and 'hex' in octave
'''
asdouble = ctypes.c_double(x)
xpointer = ctypes.addressof(asdouble)
xdata = ctypes.string_at(xpointer, 8)
xbin= [(bin(i)[2:].zfill(8)) for i in xdata[-1::-1]]
print(x, "=", x.hex(), "=", decimal.Decimal(x))
print("representation in format 'bit' and 'hex' of octave")
print("with spaces separating each byte")
print(" ".join([i.zfill(8) for i in xbin]), "=",
" ".join([hex(int(i,2))[2:].zfill(2) for i in xbin]))
print("without spaces separating the bytes")
print("".join([i.zfill(8) for i in xbin]), "=",
"".join([hex(int(i,2))[2:].zfill(2) for i in xbin]))
def print_as_octave_native_bit_hex(x):
'''
This function prints the binary representation as it would
be printed using the format 'native-bit' and 'native-hex' in octave
'''
asdouble = ctypes.c_double(x)
xpointer = ctypes.addressof(asdouble)
xdata = ctypes.string_at(xpointer, 8)
xbin = [(bin(i)[2:].zfill(8)) for i in xdata]
print(x, "=", x.hex(), "=", decimal.Decimal(x))
print("representation in format 'native-bit' and 'native-hex' of octave")
print("with spaces separating each byte")
print(" ".join([(i.zfill(8))[-1::-1] for i in xbin]), "=",
" ".join([hex(int(i,2))[2:].zfill(2) for i in xbin]))
print("without spaces separating the bytes")
print("".join([(i.zfill(8))[-1::-1] for i in xbin]), "=",
"".join([hex(int(i,2))[2:].zfill(2) for i in xbin]))
x=1.1+2.2
print_as_octave_bit_hex(x)
print(" ")
print_as_octave_native_bit_hex(x)
3.3000000000000003 = 0x1.a666666666667p+1 = 3.300000000000000266453525910037569701671600341796875
representation in format 'bit' and 'hex' of octave
with spaces separating each byte
01000000 00001010 01100110 01100110 01100110 01100110 01100110 01100111 = 40 0a 66 66 66 66 66 67
without spaces separating the bytes
0100000000001010011001100110011001100110011001100110011001100111 = 400a666666666667
3.3000000000000003 = 0x1.a666666666667p+1 = 3.300000000000000266453525910037569701671600341796875
representation in format 'native-bit' and 'native-hex' of octave
with spaces separating each byte
11100110 01100110 01100110 01100110 01100110 01100110 01010000 00000010 = 67 66 66 66 66 66 0a 40
without spaces separating the bytes
1110011001100110011001100110011001100110011001100101000000000010 = 6766666666660a40
我懷疑它; Python不鼓勵知道或關心事物在內存中的存儲位置和方式。你想用它做什麼? – jonrsharpe
相關:[Python中的float的二進制表示形式(位不是十六進制)](http://stackoverflow.com/q/16444726/953482)。這只是爲了漂浮。 – Kevin
@凱文感謝您的鏈接,但它不是我所期待的。 @jonsharpe我發現它非常方便,在教授數值分析類時,使用八度中的「格式位」來解釋浮點表示法,歸一化與非規格化浮點數等。但是我想開始使用python作爲類,因此查詢。 –