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

StackOverflow https://stackoverflow.com/questions/872544

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

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^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 интервала между представимыми целыми числами.

Точность, указанная в ссылке Питера Р. на ссылку MSDN, вероятно, является хорошим практическим правилом, но, конечно, реальность сложнее.

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

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

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

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

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

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

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

  • 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 (четверенная точность)

Смотрите также

Видеть ИЭЭЭ 754-1985:

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top