Документация MSDN бессмысленна и неверна.
Плохая концепция. Двоичный формат с плавающей запятой не имеет точности в десятичных числах, потому что в нем нет десятичных цифр. Он представляет числа со знаком, фиксированным числом двоичных цифр (битов) и показателем степени двойки.
Неправильно на верхнем конце. Формат с плавающей запятой представляет ровно много чисел с бесконечной точностью. Например, цифра «3» представлена точно. Вы можете записать его в десятичной системе сколь угодно долго, 3.0000000000…, и все десятичные цифры будут правильными. Другой пример: 1.40129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125e-45. Это число имеет 105 значащих цифр в десятичной системе, но формат float
представляет его в точности (это 2 −149 ).
Неправильно на нижнем конце. * Когда «999999,97» преобразовывается из десятичного числа в float
, результат составляет 1 000 000. Таким образом, даже одно десятичное число di git не является правильным.
Не является мерой точности. Поскольку значение float
имеет 24 бита, разрешение его младшего бита составляет около 2 * В 1022 * 23 раз лучше, чем разрешение самого высокого бита. Это около 6,9 цифр в том смысле, что log 10 2 23 составляет около 6,9. Но это лишь говорит нам о разрешении - о грубости - изображения. Когда мы конвертируем число в формат float
, мы получаем результат, который отличается от числа не более чем на ½ этого разрешения, потому что мы округляем до ближайшего представимого значения. Таким образом, преобразование в float
имеет относительную ошибку не более 1 части из 2 24 , что соответствует примерно 7,2 цифрам в указанном выше смысле.
Где эти числа откуда?
Итак, если «~ 6-9 цифр» не является правильным понятием, не исходит из фактических границ цифр и не измеряет точность, откуда это взялось? Мы не можем быть уверены, но 6 и 9 присутствуют в двух описаниях формата float
.
6 - наибольшее число x , для которого это гарантировано:
- Если какое-либо десятичное число, содержащее не более x значащих цифр, находится в пределах конечных границ формата
float
и преобразуется в ближайшее значение, представленное в формате, то при преобразовании результата до ближайшего десятичного числа, содержащего не более x значащих цифр, результат этого преобразования равен исходному числу.
Таким образом, разумно сказать, что float
может сохранить как минимум шесть десятичных цифр. Однако, как мы увидим, здесь нет границы, состоящей из девяти цифр.
9 - наименьшее число x , которое гарантирует это:
- Если любое конечное * Число 1062 * преобразуется в ближайшее десятичное число с x цифрами, а затем, когда результат конвертируется в ближайшее значение, представленное в
float
, результат этого преобразования равен исходному числу.
По аналогии, если float
является контейнером, то самый большой «десятичный контейнер», который гарантированно помещается в него, состоит из шести цифр, а наименьший «десятичный контейнер», который гарантированно хранит его, - девять цифр. 6 и 9 аналогичны внутренним и внешним размерам контейнера float
.
Предположим, у вас есть блок длиной 7,2 единицы, и вы смотрите на его размещение на ряду кирпичей длиной 1 единицу. Если вы поместите начало блока в начало кирпича, он расширится на 7,2 кирпича. Однако кто-то другой выбирает, где он начинается, он может запустить его в середине кирпича. Затем он покроет часть этого кирпича, все следующие 6 кирпичей и часть последнего кирпича (например, 0,5 + 6 + 0,7 = 7,2). Таким образом, блок из 7,2 единиц гарантированно покрывает только 6 кирпичей. И наоборот, 8 кирпичей могут скрыть блок из 7,2 единиц, если вы выберете место их размещения. Но если кто-то другой выберет, где они начнутся, первый может скрыть всего 0,1 единицы блока. Затем вам понадобится еще 7 и еще одна дробь, значит понадобится 9 кирпичей.
Причина, по которой эта аналогия сохраняется, состоит в том, что степени двойки и степени 10 неравномерно расположены друг относительно друга. 2 10 (1024) около 10 3 (1000). 10 - это показатель степени, используемый в формате float
для чисел от 1024 (включительно) до 2048 (исключая). Таким образом, этот интервал от 1024 до 2048 похож на блок, который был размещен сразу после окончания 100-1000 и начала блока 1000-10 000.
Но обратите внимание, что это свойство, включающее 9 цифр, является внешним измерение - это не возможность, которую может выполнить float
, или услуга, которую он может предоставить. Это то, что нужно float
(если оно должно храниться в десятичном формате), а не то, что он предоставляет. Таким образом, количество цифр, которое может хранить float
, не ограничено.
Дополнительная литература
Для лучшего понимания арифметики с плавающей запятой c рассмотрите изучение стандарта IEEE-754 для арифметики с плавающей запятой c или хорошего учебника, например Handbook of Floating-Point Arithmeti c by Jean-Michel Muller et al .