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

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

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

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

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

7 ответов


Я рисую этот ответ из документации MATLAB для функции EPS, но он должен применяться повсеместно к 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^-11), максимальный размер, что число может быть 1. Любое большее, чем это, и расстояние между числами с плавающей запятой более 0.0005.

  • на один...

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

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

  • на двойной точности...

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

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


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

  • каждое 2-е целое число между 2^53 + 2 и 2^54 может быть представлено точно.
  • каждое 4-е целое число между 2^54 + 4 и 2^55 может быть представлено точно.
  • каждое 8-е целое число между 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 расстояния между представимыми целыми числами.


точность цитируемой формы ссылки Питера R на MSDN ref, вероятно, является хорошим эмпирическим правилом, но, конечно, реальность сложнее.

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

Если у вас есть выходные, чтобы убить, взгляните на Что Каждый Компьютерщик Должен Знать Об Арифметике С Плавающей Запятой. Вы, вероятно, будете особенно заинтересованы в разделы точность и преобразование двоичного в десятичное.


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

Если вы хотите точность к одному месту, как в вы можете представить каждое целое число, ответ довольно прост: показатель сдвигает десятичную точку в правый конец дроби. Итак, 10-битная дробь получает ±211.

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

Single-precision имеет 23-битную дробь, поэтому у вас будет ±224 целых чисел.

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

  • 210 = 1,024
  • 211 = 2,048
  • 223 = 8,388,608
  • 224 = 16,777,216
  • 253 = 9,007,199,254,740,992 (двойной точности)
  • 2113 = 10,384,593,717,069,655,257,060,992,658,440,192 (quad-precision)

посмотреть также


посмотреть IEEE 754-1985:

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

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


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


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