Плотность числа с плавающей запятой - Величина числа - PullRequest
3 голосов
/ 10 августа 2011

Правда ли, что чем больше число с плавающей запятой больше (положительное или отрицательное), тем меньше у нас битов для кодирования десятичных цифр?

Можем ли мы кодировать больше десятичных цифр между 2 1 и 2 2 , чем между 2 16 и 2 32 ?

Существует ли одинаковое количество значений между этими двумя диапазонами?

Ответы [ 4 ]

7 голосов
/ 12 июня 2014

IEEE 754, двоичные числа 32 указаны следующим образом:

IEEE 754, binary-32 number format

По существу, оно состоит из трех частей:

  • 1 бит float32_signпредставляющий знак
  • 23 бит float32_fraction[], представляющий коэффициенты двоичной дроби
  • 8 бит float32_exp, представляющий целое число 2

См. Википедия/ Single-precision_floating-point_format для деталей.

Формула для получения действительного числа:

IEEE 754, binary-32 number formula

Забывая показатель степени, дробная часть можетточно представлять pow(2, 23) = 8388608 значений.Максимальные и минимальные значения в этом диапазоне:

    ( 1 + 0, 1 + sum(pow(2, -i)) )  # All co-efficients being 0 and 1 resp. in the above formula
=>  ( 1, 2 - pow(2, -23) )          # By geometric progression
~>  ( 1, 2 )                        # Approximation by upper-bound

Таким образом, для показателя степени 1 (float32_exp = 128) у нас будет 8388608 чисел между (1,2) и (-1,-2).

Однако для больших чисел, например, когда показатель степени равен 126 (float32_exp = 253), у нас все еще есть только 8388608 чисел, представляющих разрыв между (2^126), 2^127) и (-2^126, -2^127).

График распределения между 1 и 128 выглядит следующим образом:

enter image description here

График настолько крутой при 0, что при построении графика он будет выглядеть как единственное значение только при 0.Обратите внимание, что затухание является экспоненциальным.

Формула для получения числа чисел с плавающей запятой между двумя значениями:

def num_floats(begin, end):
    # pow(2, 23) * (log(end, 2) - log(start, 2)) == pow(2, 23) * log(end/start, 2)
    return 8388608 * math.log(float(end)/float(begin), 2)
2 голосов
/ 10 августа 2011

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

Другими словами, числа с плавающей запятой имеют только фиксированное число битов для мантиссы , и, по мере того, как числа становятся больше, меньшее количество этих цифр в манитсе будет после десятичной точки (что я думаю, что вы спрашивали).

Альтернативой могут быть числа с фиксированной точкой , где число цифр после десятичной точки является постоянным. Но не во многих системах используются числа с фиксированной запятой, поэтому, если вы этого хотите, вы должны свернуть свои собственные или использовать стороннюю библиотеку.

1 голос
/ 10 августа 2011

Число с плавающей запятой - это двоичное представление мантиссы и показателя степени.Для IEEE 754 short real, наиболее распространенного 32-разрядного представления, есть знаковый бит, 23 + 1 бит для мантиссы и диапазон экспонент от –126 до +127 при степени двойки.

Итак, для адресации ваших точек:

  1. Количество бит для кодирования цифр является постоянным.около 7 десятичных цифр для 32-разрядного числа с плавающей точкой и около 16 для 64-разрядного числа с плавающей точкой.

  2. См. 1.

  3. Даare.

1 голос
/ 10 августа 2011

С Что должен знать каждый компьютерщик об арифметике с плавающей точкой :

Как правило, число с плавающей точкой будет представлено как ± d.dd ... d × e, где d.dd ... d называется значимым и имеет p цифр. Больше точно ± d0. d1 d2 ... dp-1 × e представляет число.

Следовательно, ответ - да, потому что мантисса (старое слово для значимого) имеет фиксированное количество бит.

...