Почему число чисел с плавающей запятой составляет 7 или 6

Я вижу это в журнале Википедии 2 24 = 7,22 .

Я понятия не имею, почему мы должны рассчитать 2 ^ 24 и почему мы должны брать log10 …… Мне действительно нужна ваша помощь.

почему число чисел с плавающей запятой составляет 7 или 6 (?)

Рассмотрим некоторые мысли, использующие принцип Pigeonhole :

  1. binary32 float может кодировать около 2 32 разных чисел точно . Числа, которые можно написать в тексте, например 42.0, 1.0, 3.1415623 …, бесконечны, даже если мы ограничимся диапазоном, например -10 38 … +10 38 . Любой временной код имеет текстовое значение, такое как 0.1f , оно закодировано рядом с float , что может быть не таким же текстовым значением. Вопрос в том: сколько цифр мы можем закодировать и по-прежнему поддерживать отличительный float ?
  2. Для разных диапазонов мощности-2 значения 2 23 (8,388,608) обычно линейно кодируются.
  3. В диапазоне [1.0 … 2.0] значения 2 23 (8 388 608) линейно кодируются.
  4. В диапазоне [2 33 или 8 589 934 592 … 2 34 или 17,179,869,184) снова значения 2 23 (8 388 608) линейно кодируются: 1024,0 друг от друга. В субдиапазоне [9 000 000 000 и 10 000 000 000] существует около 976 562 разных значения.

Объедините это вместе …

  1. В качестве текста диапазон [1.000_000 … 2.000_000], используя 1 ведущую цифру и 6 маршрутов, есть 1 000 000 различных значений. Per # 3, в том же диапазоне, с 8 388 608 различных float существует, позволяя каждому текстовому значению сопоставляться с другим float . В этом диапазоне мы можем использовать 7 цифр .

  2. Как текст, диапазон [9 000 000 * 10 3 и 10 000 000 * 10 3 ), используя 1 ведущую цифру и 6 маршрутов, есть 1 000 000 различных значений. Per # 4, в том же диапазоне, существует менее 1 000 000 различных значений float . Таким образом, некоторые десятичные текстовые значения преобразуются в один и тот же float . В этом диапазоне мы можем использовать 6, а не 7 цифр для отличительных преобразований.

Худший случай для типичного float6 значащих цифр . Чтобы найти предел для вашего float :

 #include  printf("FLT_DIG = %d\n", FLT_DIG); // this commonly prints 6 

… не знаю, почему мы должны вычислять 2 ^ 24 и почему мы должны брать log10

2 ^ 24 является обобщением, как с общим float и его 24 битами двоичной точности, что соответствует причудливой десятичной системе с 7,22 … цифрами. Мы берем log10 для сравнения двоичного float с десятичным текстом.

2 24 == 10 7.22 …

Но мы не должны принимать 2 24 . Давайте рассмотрим, как FLT_DIG определяется из C11dr §5.2.4.2.2 11:

число десятичных цифр, q , так что любое число с плавающей запятой с q десятичными цифрами может быть округлено в число с плавающей запятой с цифрами p radix b и обратно без изменения на q десятичных цифр,

p log 10 b …………. если b – мощность 10
⎣ ( p – 1) log 10 b ⎦ .. в противном случае

Уведомление «log 10 2 24 » аналогично «24 log 10 2».

В качестве float значения распределяются линейно между степенями 2, как показано в № 2,3,4.

В качестве текста значения распределяются линейно между степенями 10, как 7 значащих цифр [1.000000 … 9.999999] * 10 some_exponent .

Переход этих двух групп происходит при разных значениях. 1,2,4,8,16,32 … против 1,10,100, … При определении наихудшего случая мы вычитаем 1 из 24 бит для учета неправильного выравнивания.

⎣ ( p – 1) log 10 b ⎦ -> floor((24 − 1) log10(2)) -> floor(6.923...) -> 6.

Если бы наш float использовал базу 10, 100 или 1000, а не очень часто 2, переход этих двух групп происходил бы с одинаковыми значениями, и мы бы не вычитали один.

Одноточечный float IEEE 754 имеет 24-битную мантиссу. Это означает, что он имеет 24 двоичных бита.

Но нам может быть интересно узнать, сколько десятичных цифр стоит точности.

Один из способов вычислить это – рассмотреть, сколько 24-битных двоичных чисел есть. Ответ, конечно, равен 2 24 . Таким образом, эти двоичные числа идут от 0 до 16777215.

Сколько десятичных цифр? Ну, log10 дает вам количество десятичных цифр. log10 (2 24 ) – 7,2 или чуть более 7 десятичных цифр.

И посмотрите на это: 16777215 имеет 8 цифр, но ведущая цифра равна 1, так что на самом деле это всего лишь немного больше 7 цифр.

(Конечно, это не означает, что мы можем представлять только числа от 0 до 16777215). Это означает, что мы можем точно представлять цифры от 0 до 16777215. Но мы также получили экспонента для игры. Мы можем представлять числа от 0 до 1677721,5 более или менее точно в одном месте после десятичной, цифры от 0 до 167772,15 более или менее точно до двух десятичных точек и т. д. И мы можем представлять числа от 0 до 167772150 или от 0 до 1677721500, но постепенно менее точно – всегда с ~ 7 цифр точности, что означает, что мы начинаем терять точность в младших разрядах слева от десятичной точки.)

Другой способ сделать это – отметить, что log10 (2) составляет около 0,3. Это означает, что 1 бит соответствует примерно 0,3 десятичных цифр. Таким образом, 24 бита соответствуют 24 × 0,3 = 7,2.

(На самом деле, с плавающей точкой с одиночной точностью IEEE 754 явно хранится только 23 бита, а не 24. Но там есть неявный ведущий 1 бит, поэтому мы получаем эффект 24 бит.)

Давайте начнем немного меньше. С 10 битами (или 10 базовыми 2 цифрами) вы можете представить числа 0 до 1023. Таким образом, вы можете представить до 4 цифр для некоторых значений, но 3 цифры для большинства других (те, которые ниже 1000).

Чтобы узнать, сколько цифр в десятичной (десятичной) цифре может быть представлено пучком базовых чисел (бит), вы можете использовать log10 () максимального представляемого значения, то есть log10 (2 ^ 10) = log10 ( 2) * 10 = 3,01 ….

Вышеуказанное означает, что вы можете представлять все 3 цифры – или меньше – и несколько 4 цифр. Ну, это легко проверить: 0-999 имеют не более 3 цифр, а 1000-1023 – 4.

Теперь возьмите 24 бита. В 24 битах вы можете хранить log10 (2 ^ 24) = 24 * log (2) base-10 цифр. Но поскольку верхний бит всегда один и тот же, на самом деле вы можете хранить log10 (2 ^ 23) = log10 (8388608) = 6,92. Это означает, что вы можете представить большинство 7 цифр, но не все. Некоторые из чисел, которые вы можете точно представлять, могут иметь только 6 цифр.

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