Based on the answer by @Hannes Karppila, here are two functions which show the machine representation of any number in the binary and hex format. It uses essentially the same logic as that answer, but fills up the output with zeros to show the "correct" length for each byte.
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