from struct import pack, unpack
def sem(x):
# Упаковываем число double в 8 байт.
# >d — double, порядок байт Big-Endian
raw_bytes = pack('>d', x)
# Те же самые байты распаковываем как беззнаковое
# 64-битное целое число
x_as_int = unpack('>Q', raw_bytes)[0]
# Получаем двоичное представление длиной ровно 64 бита
bitstring = f'{x_as_int:064b}'
# IEEE 754:
# 1 бит — знак
# 11 бит — порядок
# 52 бита — мантисса
sign = int(bitstring[0], 2)
exponent = int(bitstring[1:12], 2)
significant = int(bitstring[12:], 2)
return raw_bytes, bitstring, sign, exponent, significant
a, b, c = 0.1, 0.2, 0.3
print("Проверка:")
print(f"a + b == c: {a + b == c}")
print(f"a + b = {a + b:.17f}")
print(f"c = {c:.17f}")
print("\nПредставление чисел IEEE 754:")
for name, value in [('a', a), ('b', b), ('c', c), ('a+b', a + b)]:
raw_bytes, bitstring, sign, exponent, significant = sem(value)
print(f"\n{name} = {value}")
print(f"Байты: {raw_bytes.hex(' ')}")
print(f"64 бита: {bitstring}")
print(f"Знак: {sign}")
print(f"Порядок: {exponent}")
print(f"Мантисса: {significant:052b}")