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

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

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

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

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

Ответы [ 7 ]

93 голосов
/ 16 мая 2009

Я рисую этот ответ из документации MATLAB для функции EPS , но он должен применяться повсеместно к IEEE-754 числам с плавающей запятой.

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

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

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

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.

21 голосов
/ 17 мая 2009

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

  • Каждое 2-е целое число от 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 промежутка между представимыми целыми числами.

17 голосов
/ 16 мая 2009

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

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

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

4 голосов
/ 16 мая 2009

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

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

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

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

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

  • 2 10 = 1024
  • 2 11 = 2048
  • 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 (четверная точность)

Смотри также

2 голосов
/ 16 мая 2009

См. IEEE 754-1985 :

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

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

0 голосов
/ 16 мая 2009

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

0 голосов
/ 16 мая 2009

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

...