Печать машинного представления float

235
10 июня 2017, 12:47

Есть стандарт IEEE 754 двоичного представления чисел и их арифметики. В нем описываются нормализованные числа и ненормализованные. В теории все понятно. Но я хочу на консоль распечатать несколько ненормализованных чисел в их внутреннем представлении, машинном, т.е. с характеристикой и мантиссой. Как это можно сделать, например, на Python, C#? И еще попутно вопрос. Можно ли работать в языках высокого уровня с вещественными литералами в двоичной системе счисления?

Answer 1

Но я хочу на консоль распечатать несколько ненормализованных чисел в их внутреннем представлении, машинном, т.е. с характеристикой и мантиссой

На Python3 на основе ответа с EnSO:

import struct
def binary(num):
    bins = tuple(bit for byte in (tuple(bin(c).replace('0b', '').rjust(8, '0'))\
        for c in struct.pack('!f', num)) for bit in byte)
    print(bins[0] + ' ' + ''.join(bins[1:9]) + ' ' + ''.join(bins[9:]))
binary(1.0)
binary(-1.0)
binary(1.175494351e-38)
binary(1.401298464e-45)

Отдельно выводятся знак, порядок (смещённый) и мантисса.

Для чисел двойной точности нужно заменить !f на !d и соответственно выводить больше байт для порядка:

import struct
def binary(num):
    bins = tuple(bit for byte in (tuple(bin(c).replace('0b', '').rjust(8, '0'))\
        for c in struct.pack('!d', num)) for bit in byte)
    print(bins[0] + ' ' + ''.join(bins[1:12]) + ' ' + ''.join(bins[12:]))
binary(2.716154612436e-312)

Чтобы перевести биты обратно в число, можно использовать такую функцию:

def binary_to_float(num):
    return struct.unpack("!f", int(num, 2).to_bytes(4, byteorder='big'))[0]
print(binary_to_float('10111111100000000000000000000000'))
READ ALSO
Патч private на public

Патч private на public

Как пропатчить переменную в dll с private на public удаленно?

231
Работа с RDP/SSH в C# [требует правки]

Работа с RDP/SSH в C# [требует правки]

Возможно ли запустить программу командой через rdp или ssh зная ток имя файла, если да, то можно поподробнее?

227
Как вывести все данные из таблицы в Unity?

Как вывести все данные из таблицы в Unity?

Как вывести все подряд данные из таблицы в Unity? Есть такой код, но выдает ошибку:

364
Вывод информации в GridView

Вывод информации в GridView

Работаю в ASPNET с DevExpress компонентами

236