Загрузка данных


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}")