from struct import pack, unpack
def get_next_float(value: float) -> float:
"""
Принимает float число и возвращает следующее за ним
минимально возможное число с плавающей точкой (ULP).
"""
# Шаг 1: Конвертируем float в сырые байты (double, 8 байт)
raw_bytes = pack(">d", value)
# Шаг 2: Интерпретируем эти байты как целое 64-битное число
int_from_float = unpack(">Q", raw_bytes)[0]
# Шаг 3: Шаг к следующему битовому представлению (+1)
next_int_from_float = int_from_float + 1
# Шаг 4: Конвертируем обратно в байты и затем во float
next_float = unpack(">d", pack(">Q", next_int_from_float))[0]
return next_float
a = 0.1
b = 0.2
c = 0.3
calculated_sum = a + b
next_after_c = get_next_float(c)
print(f"Сумма a + b: {calculated_sum:.20f}")
print(f"Истинное c: {c:.20f}")
print(f"Следующее число после c: {next_after_c:.20f}")
is_next = (calculated_sum == next_after_c)
print(f"\nРезультат (a + b) равен следующему за 0.3 числу? {is_next}")