Сколько различных значений можно сохранить в форматах с плавающей запятой?

#numbers #ieee-754

#числа #ieee-754

Вопрос:

Мои предположения для IEEE 754-2008:

двоичный файл16 — 2 ^ 16 различных значений, двоичный файл32 — 2 ^ 32 различных значения, … двоичный файл128 — 2 ^ 128 различных значений.

Это правильно?

Ответ №1:

Это вопрос с подвохом.

Форматы с плавающей запятой определяют некоторые специальные значения. Считаете ли вы их различными, зависит от вашей точки зрения. Следующее для двойной точности (binary64):

  1. Существует два представления 0: со знаковым битом 0 или 1, а экспонента и мантисса равны нулю. Значения различимы тем фактом, что 1 / 0 = бесконечность и 1 /-0 = -бесконечность. Но они сравниваются одинаково.
  2. Существует 2 бесконечности, где первые 12 бит равны 0x7ff или 0xfff, а мантисса равна нулю. Это не конечные действительные числа, но они являются значениями.
  3. Существует целый ряд значений, не являющихся числами (NaN), имеющих биты знака экспоненты 0x7ff (сигнальный NaN) или 0xfff («тихий» NaN) и ненулевую мантиссу. Опять же, это не действительные числа, но они являются различимыми значениями.

Итак, подведем итог:

  1. Общее количество различимых значений (действительных чисел или других) равно 2 ^ 64.
  2. Количество различных действительных чисел, исключая бесконечности и считая ноль только один раз, равно 2*(2^11-1)*2^52-1 = 18,437,736,874,454,810,623 .

Для binary16 количество различных действительных чисел равно 2*(2^5-1)*2^10-1 = 63,487 . Для binary32 это 2*(2^8-1)*2^23-1=4,278,190,079 . Для binary128 это 2*(2^15-1)*2^112-1 или около 3.4*10^38 того .

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

1. Да, я забыл о диапазоне NaN. Итак, есть 2*(2^8-1)*2^23-1 = 4278190079 для binary32, верно?

2. Использование binary16 для ясности: это 2*(2^5-1)*(2^10-1) или (2*(2^5-1)*2^10)-1 ? Последнее имеет для меня больше смысла, но если это первое, не могли бы вы уточнить?