Страницы

Поиск по вопросам

пятница, 26 апреля 2019 г.

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

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


Ответ

Но я хочу на консоль распечатать несколько ненормализованных чисел в их внутреннем представлении, машинном, т.е. с характеристикой и мантиссой
На 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'))

Комментариев нет:

Отправить комментарий