Есть стандарт 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'))
Комментариев нет:
Отправить комментарий