На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: RaD
  
    > IEEE-754 hex -> float, python 3.7
      Есть число 0x471b4ac2 представленное в IEEE-754, которое необходимо преобразовать в число с плавающей точкой (float).

      В сети нашёл конвертер, который выполняет данную операцию и преобразует 0x471b4ac2 в 39754.758.

      Прошу помочь с алгоритмом для Python :wall:

      Нашёл преобразование float -> bin:
      ExpandedWrap disabled
        import struct
         
        getBin = lambda x: x > 0 and str(bin(x))[2:] or "-" + str(bin(x))[3:]
         
        def float2bin32(value):
        #    val = struct.unpack('Q', struct.pack('d', value))[0] # 64
            val = struct.unpack('I', struct.pack('f', value))[0] # 32
            return getBin(val)


      Мне же требуется обратное преобразование, то есть bin -> float

      С преобразованием bin -> hex и обратно затруднений не имеется :)
      Понедельник начинается в субботу.©
        знаний математики хватило, чтобы разобраться в алгоритме самостоятельно. Очень помог параграф 4 отсюда.

        Ниже моя реализация. Сделал как умею, так что за изящность кода прошу не пинать.
        ExpandedWrap disabled
          def hex2bin(hx): # IEEE-754 32 -> bin
              bn = bin(int(hx, 16))[2:]
              return bn
           
          def bin2dec(bn): # IEEE-754 32 -> float
              if len(bn) == 31:
                  s = 0
                  e = bn[0:8]
                  m = bn[8:]
              else:
                  s = 1
                  e = bn[1:8]
                  m = bn[9:]
              f = (-1)**s*2**(int(e,2)-127)*(1+int(m,2)/2**23)
              return f

        :whistle:
        Понедельник начинается в субботу.©
          Можно было воспользоваться тем же модулем struct. Там наряду с unpack есть функция с противоположным действием - pack.
          Всё написанное выше это всего лишь моё мнение, возможно ошибочное.
            Цитата amk @
            Можно было воспользоваться тем же модулем struct. Там наряду с unpack есть функция с противоположным действием - pack.

            пример, пожалуйста!
            Понедельник начинается в субботу.©
              Цитата bur80 @
              пример, пожалуйста!
              Английский не понимаешь? В справке всё написано.

              struct.pack('f', 39754.758)
              преобразует число с плавающей точкой в последовательность байт b'\xc2J\x1bG' == bytes(194, 74, 27, 71)

              int.from_bytes(b'\xc2J\x1bG', byteorder='little')
              преобразует полученную последовательность в целое число 1192970946 == 0x471b4ac2

              Последнее преобразование можно выполнить с использованием модуля struct
              struct.unpack('i', b'\xc2J\x1bG')[0]

              Или в одну строку

              int.from_bytes(struct.pack('f', 39754.758), byteorder='little')
              struct.unpack('i', struct.pack('f', 39754.758))[0]

              Последняя строка отличается от строки в твоём первом посте только расположением форматов 'i' и 'f' (!).
              Всё написанное выше это всего лишь моё мнение, возможно ошибочное.
                ExpandedWrap disabled
                  import struct
                  print(struct.unpack('!f', bytes.fromhex('{:x}'.format(orig)))[0])
                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script Execution time: 0,0767 ]   [ 14 queries used ]   [ Generated: 19.07.19, 23:01 GMT ]