формат с плавающей запятой ieee - PullRequest
1 голос
/ 19 ноября 2011

У меня проблемы с преобразованием 19861119 в формат ieee с плавающей запятой (одинарная точность).Я надеюсь, что кто-то может сказать мне, где я заблудился.

В двоичном формате значение равно b1:00101111:00001110:01111111 (используется: для отметки каждых 8 битов от rhs), что составляет b1.00101111:00001110:01111111 * 2^24.Таким образом, значение с плавающей запятой равно b00101111:00001110:01111111, а смещенная экспонента равна 24 + 127 = 151 = b10010111.Длина с плавающей точкой - 24 бита, но формат ieee позволяет использовать только 23 бита, что мне кажется проблематичным.Не хватает ли формату достаточной точности для сохранения даты в ггггммдд?

Когда я записываю вывод из Python struct.pack("f", 19861119) в файл и смотрю в шестнадцатеричном редакторе, я вижу x4087974b.После учета порядка байтов это x4b978740.Итак, Python написал смещенную экспоненту b01010111 = 87 и число с плавающей точкой b0010111:10000111:01000000, которое мало похоже на любое из чисел, которое я вычислил.Что я пропустил?

Заранее спасибо,

Ян

Ответы [ 3 ]

1 голос
/ 19 ноября 2011

Исходное число:

1 0010 1111 0000 1110 0111 1111

Нормализация у нас есть:

1,0010 1111 0000 1110 0111 1111 x 2²⁴

Поскольку будет сохранено только 23 бита дробной части:

  1,0010 1111 0000 1110 0111 111 x 2²⁴
                              +1 (if rounded)
= 1,0010 1111 0000 1110 1000 000 x 2²⁴

= 0|100 1011 1|001 0111 1000 0111 0100 0000
  s    exp         23 bit fractional part
= 0x4B978740

И если я хорошо понял, это то, что вы получаете.

1 голос
/ 19 ноября 2011

Число сохраняется округлено : 19861120 становится 0x4B978740. Незаземленное значение 0x4B97873F.

Вот 0x4B978740 в двоичном виде:

0   10010111   [1]   0010111 10000111 01000000

+   127 + 24    1                   ~ .1838150

А 2 24 = 16777216.

Онлайн-калькулятор отлично подходит для изучения таких деталей.

Разговоры о режимах округления в IEE754 могут заполнить целое эссе ...

0 голосов
/ 20 ноября 2011

32-битная одинарная точность не имеет достаточной точности для хранения YYYYMMDD дат Допустим, мы получаем до 20 миллионов, что составляет 25 бит. Таким образом, вы всегда теряете один бит.

При форматах с плавающей запятой следует иметь в виду, что в части мантиссы первая цифра всегда равна 1. Точность одинарной и двойной точности используется при ее отсутствии.

В вашей записи: 19861119 = +1 * b1.00101111:00001110:01111111 * 2^24

Итак, для трех частей числа имеем:

  1. Знак 0.
  2. Экспонента составляет 127 + 24 = 151 = b1001011: 1
  3. Часть мантиссы - это первые 23 бита после начального нуля, округленные до четного: `0010111: 10000111: 01000000

Итак, полный номер:

0 1001011:1 0010111:10000111:01000000
s eeeeeee e mmmmmmm mmmmmmmm mmmmmmmm

или в шестнадцатеричном формате, в зависимости от завершения: 4b978740 / 4087974b.

...