Хотя, нейронки вот что-то похожее на правду пишут (не проверял). По крайней мере, есть от чего исходить:
Copilot:- Код: Выделить всё
 import math
# Пример 80-битного числа (в виде строки байтов)
float80_bytes = b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
def convert_80bit_to_double(float80_bytes):
    # Разбор 80-битного числа на составляющие
    sign = (float80_bytes[9] & 0x80) >> 7
    exponent = ((float80_bytes[9] & 0x7F) << 8) | float80_bytes[8]
    mantissa = float80_bytes[:8]  # 64-битная мантисса
    # Преобразование мантиссы в дробное число
    mantissa_value = int.from_bytes(mantissa, byteorder='little') / (2**64)
    # Вычисление 64-битного числа
    value = ((-1) ** sign) * (2 ** (exponent - 16383)) * mantissa_value
    return value
# Преобразование и вывод результата
float64 = convert_80bit_to_double(float80_bytes)
print(float64)
ChatGPT:Чтобы преобразовать 80-битное представление с плавающей точкой (например, формат `long double` в C) в 64-битное представление (`double`) в Python без использования сторонних библиотек, можно вручную извлечь компоненты числа (знак, экспоненту и мантиссу) из 80-битного формата и затем подогнать их под 64-битный формат. В 64-битном формате мантисса имеет меньше бит, а экспонента должна быть приведена к другому диапазону.
Вот шаги, которые вам нужно выполнить:
1. Прочитайте 80-битное число, представленное в виде 10 байт.
2. Извлеките следующие компоненты:
   - Знак (1 бит).
   - Экспонента (15 бит).
   - Мантисса (64 бита).
3. Преобразуйте эти компоненты в 64-битный формат, изменив экспоненту и мантиссу, чтобы соответствовать стандарту IEEE 754 для 64-битных чисел.
4. Получите итоговое 64-битное число.
Пример кода для конверсии из 80-битного формата в 64-битный:
- Код: Выделить всё
 def float80_to_double(bytes_80):
    # Проверяем, что вход — это 10 байт (80 бит)
    if len(bytes_80) != 10:
        raise ValueError("Input must be 10 bytes long for 80-bit float")
    # Разбираем 10 байт на компоненты 80-битного числа:
    sign = (bytes_80[9] >> 7) & 0x01  # 1 бит
    exponent = ((bytes_80[9] & 0x7F) << 8) | bytes_80[8]  # 15 бит
    mantissa = (bytes_80[7] << 56) | (bytes_80[6] << 48) | (bytes_80[5] << 40) | \
               (bytes_80[4] << 32) | (bytes_80[3] << 24) | (bytes_80[2] << 16) | \
               (bytes_80[1] << 8) | bytes_80[0]  # 64 бита
    # Смещаем экспоненту для 64-битного формата (например, с 15 бит на 11 бит)
    # Стандарт IEEE 754 для 64-битных чисел: экспонента имеет смещение 1023
    exponent_64 = exponent - 16383 + 1023
    # Обрабатываем выходные данные:
    # Если экспонента выходит за пределы 64-битного диапазона, например, слишком мала или велика
    if exponent_64 <= 0:
        return 0.0  # Нормализованный выходной результат
    if exponent_64 >= 0x7FF:
        return float('inf') if sign == 0 else float('-inf')
    # Преобразуем мантиссу и экспоненту в 64-битный формат
    mantissa_64 = mantissa >> 11  # Оставляем только верхние 52 бита мантиссы
    result = (sign << 63) | (exponent_64 << 52) | mantissa_64
    # Преобразуем в число
    return struct.unpack('d', struct.pack('Q', result))[0]
import struct
# Пример 80-битного числа (10 байт)
bytes_80 = bytearray([0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
# Преобразуем в 64-битное число
double_value = float80_to_double(bytes_80)
print(double_value)
Этот код:
1. Преобразует 80-битный формат (который представлен 10 байтами) в структуру с плавающей точкой 64-бит.
2. Выполняет преобразование с учетом мантиссы и экспоненты в стандарт IEEE 754.
Пожалуйста, учитывайте, что в реальных приложениях точность может быть потеряна при таком преобразовании, поскольку 64 бита имеют меньшую точность и диапазон, чем 80 бит.