Какой диапазон чисел может быть представлен в 16-, 32- и 64-битных системах IEEE-754?

Я немного знаю о том, как числа с плавающей запятой представлены, но недостаточно, я боюсь.

Общий вопрос:

Для данной точности (для моих целей, числа точных десятичных знаков в базе 10), какой диапазон чисел может быть представлен для 16-, 32- и 64-битных систем IEEE-754?

В частности, меня интересует только диапазон 16-битных и 32-разрядных чисел с точностью до +/- 0,5 (в одном месте) или +/- 0,0005 (место в тысячных).

Ответ 1

Для заданного IEEE-754 числа с плавающей запятой X, если

2^E <= abs(X) < 2^(E+1)

тогда расстояние от X до следующего наибольшего представимого числа с плавающей точкой (эпсилон) равно:

epsilon = 2^(E-52)    % For a 64-bit float (double precision)
epsilon = 2^(E-23)    % For a 32-bit float (single precision)
epsilon = 2^(E-10)    % For a 16-bit float (half precision)

Приведенные выше уравнения позволяют нам вычислить следующее:

  • Для половинной точности...

    Если вам нужна точность + / -0.5 (или 2 ^ -1), максимальный размер, который может быть указан, равен 2 ^ 10. Любое значение больше этого, а расстояние между числами с плавающей точкой больше 0,5.

    Если вам нужна точность + / -0.0005 (около 2 ^ -1 1), максимальный размер, который может быть числом, равен 1. Любой больше этого, а расстояние между числами с плавающей запятой больше 0,0005.

  • Для одинарной точности...

    Если вам нужна точность + / -0.5 (или 2 ^ -1), максимальный размер, который может быть числом, равен 2 ^ 23. Любое значение больше этого, а расстояние между числами с плавающей точкой больше 0,5.

    Если вам нужна точность + / -0.0005 (около 2 ^ -1 1), максимальный размер, которым может быть число, составляет 2 ^ 13. Любое значение больше этого, а расстояние между числами с плавающей запятой больше 0,0005.

  • Для двойной точности...

    Если вам нужна точность + / -0.5 (или 2 ^ -1), максимальный размер, который может быть числом, равен 2 ^ 52. Любое значение больше этого, а расстояние между числами с плавающей точкой больше 0,5.

    Если вам нужна точность + / -0.0005 (около 2 ^ -1 1), максимальный размер, который может быть числом, равен 2 ^ 42. Любое значение больше этого, а расстояние между числами с плавающей запятой больше 0,0005.

Ответ 2

Для чисел с плавающей запятой (я дам свой ответ с точки зрения двойной точности IEEE), каждое целое число от 1 до 2 ^ 53 точно представимо. Вне 2 ^ 53 целые числа, которые являются точно представимыми, разнесены друг от друга увеличением степеней двух. Например:

  • Каждое второе целое число между 2 ^ 53 + 2 и 2 ^ 54 может быть представлено точно.
  • Каждое четное целое число между 2 ^ 54 + 4 и 2 ^ 55 может быть представлено точно.
  • Каждое восьмое целое число между 2 ^ 55 + 8 и 2 ^ 56 может быть представлено точно.
  • Каждое 16-е целое число между 2 ^ 56 + 16 и 2 ^ 57 может быть представлено точно.
  • Каждое 32-е целое число между 2 ^ 57 + 32 и 2 ^ 58 может быть представлено точно.
  • Каждое 64-е целое число между 2 ^ 58 + 64 и 2 ^ 59 может быть представлено точно.
  • Каждое 128-е целое число между 2 ^ 59 + 128 и 2 ^ 60 может быть представлено точно.
  • Каждое 256-целое число от 2 ^ 60 + 256 и 2 ^ 61 может быть представлено точно.
  • Каждое 512-целое число между 2 ^ 61 + 512 и 2 ^ 62 может быть представлено точно. , , .

Целые числа, которые не являются точно представляемыми, округляются до ближайшего представляемого целого числа, поэтому наихудшее округление составляет 1/2 интервала между представляемыми целыми числами.

Ответ 3

Точная цитата из ссылки Peter R на MSDN ref, вероятно, является хорошим правилом, но, конечно, реальность сложнее.

Тот факт, что "точка" в "плавающей точке" является двоичной точкой, а не десятичной точкой, имеет способ победить наши интуиции. Классический пример - 0,1, для которого требуется только одна цифра в десятичной форме, но она не представляется точно в двоичном виде.

Если у вас есть уик-энд, чтобы убить, посмотрите Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой. Вероятно, вас особенно интересуют разделы Precision и Двоичные в десятичные Конверсия.

Ответ 4

Во-первых, ни IEEE-754-2008, ни -1985 не имеют 16-битных поплавков; но это предлагаемое дополнение с 5-битной экспонентой и 10-битной долей. IEE-754 использует выделенный бит знака, поэтому положительный и отрицательный диапазоны одинаковы. Кроме того, у фракции подразумевается 1 спереди, поэтому вы получаете дополнительный бит.

Если вам нужна точность в одном месте, так как вы можете представлять каждое целое число, ответ довольно прост: экспонента смещает десятичную точку в правый конец дроби. Итак, 10-битная фракция получает вас ± 2 11.

Если вы хотите один бит после десятичной точки, перед этим вы отпустите один бит, поэтому у вас есть ± 2 10.

Одиночная точность имеет 23-битную дробь, поэтому у вас есть целые числа ± 2 24.

Сколько битов точности, которые вам нужны после десятичной точки, полностью зависит от вычислений, которые вы делаете, и сколько вы делаете.

  • 2 10= 1,024
  • 2 11= 2,048
  • 2 23= 8 388 608
  • 2 24= 16,777,216
  • 2 53= 9,007,199,254,740,992 (с двойной точностью)
  • 2 113= 10,384,593,717,069,655,257,060,992,658,440,192 (quad-precision)

См. также

Ответ 5

См. IEEE 754-1985:

v = (-1)^sign * s^(exponent-exponent_bias) * (1 + fraction)

Примечание (1 + фракция). Поскольку @bendin указывают, используя двоичную плавающую точку, вы не можете выразить простые десятичные значения, такие как 0,1. Подразумевается, что вы можете вводить ошибки округления, выполняя простые добавления много раз или называя такие вещи, как усечение. Если вас интересует какая-либо точность, единственный способ добиться этого - использовать десятичную запятую с фиксированной точкой, которая в основном представляет собой масштабированное целое число.

Ответ 6

Если я правильно понимаю ваш вопрос, это зависит от вашего языка.
Для С# проверьте сообщение MSDN. Float имеет 7-значную точность и двойную точность 15-16 цифр.

Ответ 7

Мне потребовалось некоторое время, чтобы понять, что при использовании удвоений в Java я не терял значительную точность вычислений. С плавающей точкой на самом деле имеет очень хорошую способность представлять числа с вполне разумной точностью. Точность, которую я терял, была сразу же после преобразования чисел decimal, введенных пользователями, в двоичное представление с плавающей запятой, которое поддерживается естественным образом. Недавно я начал преобразовывать все мои номера в BigDecimal. BigDecimal гораздо больше работает над кодом, чем с float или double, поскольку он не является одним из примитивных типов. Но, с другой стороны, я смогу точно представлять числа, которые вводят пользователи.