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



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



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




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




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

609   7  

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

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

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

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

во-первых, ни IEEE-754-2008, ни -1985 не имеют 16-битных поплавков; но это предлагаемое дополнение с 5-битным показателем и 10-битной дробью. IEE-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 + фракция). Как @bendin укажите, используя двоичную плавающую точку, вы не можете выразить простые десятичные значения, такие как 0.1. Подразумевается, что вы можете вводить ошибки округления, делая простые дополнения много раз или вызывая такие вещи, как усечение. Если вы заинтересованы в какой-либо точности вообще, единственный способ достичь этого-использовать десятичную дробь с фиксированной точкой, которая в основном это масштабированное целое число.

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

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

Comments

    Ничего не найдено.