24-разрядное двоичное число с плавающей запятой одинарной точности

Если ваш дизайн может вместить его, избегайте локального преобразования времени вместе!

Я знаю, что некоторые из них могут показаться безумными, но подумайте о UX: пользователи начинают приближаться, относительные даты (сегодня, вчера, в следующий понедельник) быстрее, чем абсолютные даты (2010.09.17, пятница 17 сентября). И когда вы думаете об этом больше, точность часовых поясов (и DST) важнее, чем ближе дата к now(), поэтому, если вы можете выразить даты / даты в относительном формате для +/- 1 или 2 недель, остальные даты могут быть UTC, и это не имеет большого значения для 95% пользователей.

Таким образом, вы можете хранить все даты в UTC и выполнять относительные сравнения в UTC и просто показывать даты UTC пользователя вне вашего порога относительной даты.

Это также может относиться и к пользовательскому вводу (но обычно более ограниченным образом). Выбор из раскрывающегося списка, который имеет только {Вчера, сегодня, завтра, в следующий понедельник, следующий четверг), намного проще и проще для пользователя, чем выбор даты. Сборщики даты являются одними из наиболее болевых компонентов, заполняющих форму. Конечно, это не сработает для всех случаев, но вы можете видеть, что для его создания требуется только немного умного дизайна.

-2
задан Ari Victor 8 April 2019 в 06:47
поделиться

1 ответ

Разделение 24-битного значения на пару 12-битных полей выглядит как правильный подход. Для двух 12-битных полей используемый здесь формат с плавающей точкой, начиная с крайнего левого бита:

  • один знаковый бит (0 для положительного, 1 для отрицательного) [116 ]

  • пять экспонентных битов, давая значение без знака, которое смещено на 15 (поэтому мы должны вычесть 15 из значения без знака этого поля, чтобы получить фактический показатель степени)

  • [114 ]

    шесть битов значащих и дают значение без знака

Абсолютное значение числа с плавающей запятой, выраженное в этом формате, будет определяться как:

significand * ( 2 ^ exponent ) / ( 2 ^ 6 )
[1110 ] Для приведенных примеров у нас есть:

0011 0110 0011 =>
  sign bit       = 0, positive
  exponent field = 01101, which is decimal 13, so actual exponent = 13 - 15 = -2
  significand    = 100011, which is decimal 35

  value = positive 35 * ( 2 ^ -2 ) / ( 2 ^ 6 ) = 0.13672

1001 0011 0101 =>
  sign bit       = 1, negative
  exponent field = 00100, which is decimal 4, so actual exponent = 4 - 15 = -11
  significand    = 110101, which is decimal 53

  value = negative 53 * ( 2 ^ -11 ) / ( 2 ^ 6 ) = -0.0004044

Вы можете подтвердить комментарий о точности этого формата, повторив эти вычисления со значениями и значениями, которые были увеличены на единицу.

0
ответ дан ottomeister 8 April 2019 в 06:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: