Снова о числах с плавающей точкой

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

    1. Какое количество верных цифр n гарантированно имеет десятичное число, представленное двоичным m разрядным кодом в формате числа с плавающей точкой.
    2. Как влияет нормализация чисел с плавающей точкой на точность представления числа при его преобразовании из одной системы счисления в другую и при арифметических действиях, выполняемых на компьютере.
    3. Как влияет округление числа, представленного в двоичном виде на его десятичный эквивалент.
    4. Как положение виртуальной точки в машинном слове влияет на значение числа, представленного в экспоненциальной форме.

    Ниже мы попытаемся ответить на эти вопросы.

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

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

    F=M*2^-p,

    где М — мантисса двоичного числа, 2^-p — характеристика числа, ее еще часто называют экспонентой, p — порядок характеристики.

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

    Если в качестве мантиссы М принять естественную запись числа, то порядок характеристики в приведенной формуле будет равен нулю, а характеристика, соответственно, единице. Мы будем иметь число, представленное как F = M*2^0=M. Например, двоичное число F= 0.011 имеет порядок p=0. Если точку в числе условно поставить перед старшей значащей цифрой, то порядок характеристики p=-1 и F=0.11*10^-1. Если точку в числе условно поставить сразу после старшей значащей цифры, то порядок p=-2 и F=1.1*10^-2. Если виртуальную точку поставить после младшего разряда мантиссы М, то мантисса будет целым числом и для нее p=-3, а F=11*10^-3. Как мы видим, во всех случаях порядок характеристики равен количеству смещений виртуальной точки в числе относительно ее положения в естественной записи. Все виды записи в наших примерах эквивалентны и имеют одно и то же значение.

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

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

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

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

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

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

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

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

    Определим, какое количество верных цифр n гарантированно имеет десятичное число, представленное двоичным m разрядным кодом в формате числа с плавающей точкой.

    Если в машинном слове для записи мантиссы числа выделено m двоичных разрядов, то максимальное целое число, которое можно записать в такую мантиссу будет равно Fmax= (2^m)-1. Все m цифр в этом числе имеют значение 1. Для m=8, например, Fmax = 2^8 — 1= 255=111111112. Пусть теперь мы имеем целое десятичное число с n значащими цифрами. Максимальное десятичное число, имеющее n значащих цифр, будет состоять из цифр, каждая из которых равна 9. Таким образом, максимальное десятичное число с n значащими цифрами может быть записано как Fmax=(10^n)-1. Например, для n=2, Fmax=10^2 -1=99.

    Для того чтобы десятичное число с n значащими цифрами гарантированно было представлено двоичным кодом с мантиссой, имеющей m разрядов, должно выполняться условие: (10^n)-1 ≤ (2^m)-1 или 10^n ≤ 2^m. Откуда log10⁡10^n≤ log10⁡2^m или n≤ m log102. Поскольку log10⁡2≈0.3, то будет справедливо неравенство n≤0.3m. Поскольку числа m и n целые, для них будет справедливо неравенство
    n≤⌊0.3m⌋. Так, для m=8, будем иметь n≤⌊0.3*8⌋=2.

    До сих пор мы говорили о целочисленной машинной мантиссе. На практике же принято считать машинную мантиссу дробным числом с виртуальной точкой, стоящей перед старшим разрядом. Эта виртуальная точка преобразует целое число, записанное в машинной мантиссе в дробное число. Преобразование целого двоичного числа с m значащими цифрами в число, которое представляет собой правильную дробь, равносильно умножению этого числа на коэффициент 2^-m. Таким образом, если в каждом разряде m разрядной машинной мантиссы записаны только единицы и при этом предполагается, что виртуальная точка стоит в начале мантиссы, то число, представленное в этой мантиссе, будет максимальным и будет равно Mmaxd = 1-2^-m. Где Mmaxd — максимальное дробное число, которое может быть представлено в m разрядной машинной мантиссе с виртуальной точкой в начале мантиссы.

    С другой стороны, если машинную мантиссу считать целочисленной, т.е. полагать, что виртуальная точка стоит сразу за младшим разрядом машинной мантиссы, то максимальное целое число Mmaxc, которое в нее можно записать, будет состоять из одних единиц и равно Mmaxc = (2^m)-1. Если теперь точку переместить в начало мантиссы, то это будет равносильно тому, что Mmaxd= Mmaxc*2^-m.

    Таким образом, в m разрядную машинную мантиссу можно записать дробные числа, лежащие в диапазоне от 0 до Mmaxc*2^-m. Где Mmaxc — максимальное целое двоичное число, которое помещается в машинную мантиссу.

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

    Например, в трехразрядную машинную мантиссу можно записать максимальное целое число 1112 = 7. Это число с виртуальной точкой перед старшим разрядом машинной мантиссы будет иметь значение 0.111=7*2^-3= 0,875. Записанное в машинной мантиссе число 1012 = 5 с виртуальной точкой перед старшим разрядом будет иметь значение 0.1012=5*2^-3= 0,625 и т.д.

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

    В англоязычной википедии [5], относительно формата doabl говорится, что в 53 разрядной машинной мантиссе можно представить 15-17 разрядное десятичное число. Однако выше мы вывели формулу, согласно которой в 53 разрядной мантиссе можно гарантировано представить десятичное число, имеющее количество значащих цифр n≤⌊0.3*53⌋ = 15. Действительно, максимальное целое двоичное число, которое может быть записано в 53 разрядную мантиссу, будет состоять из 53 единиц. Его десятичное значение будет равно (2^53) -1= 9007199254740991. Это число имеет 16 значащих десятичных цифр. Если прибавить к нему единицу, количество значащих цифр десятичного числа не изменится, оно будет равно 16, а вот двоичное представление этого, увеличенного на единицу десятичного числа, уже будет содержать на 1 значащую цифру больше. Поэтому, не все 16-ти разрядные десятичные числа могут быть представлены 53-х разрядной машинной мантиссой. В то же время, в такой двоичной мантиссе гарантированно можно представить все десятичные числа с количеством значащих цифр не более чем 15. Для гарантированного же представления десятичного числа с 17 значащими цифрами требуется машинная мантисса с количеством разрядов не менее 57, т.к. ⌊0.3*57⌋=17.

    Для того чтобы рассмотренные в примерах выше целочисленные мантиссы сместить в область дробных чисел, надо все числа умножить на масштабный коэффициент 2^-53. Тогда максимальное двоичное дробное число в 53-х разрядной машинной мантиссе будет иметь вид:
    0.11111111111111111111111111111111111111111111111111111 = 11111111111111111111111111111111111111111111111111111 *2^-53= 9007199254740991*2^-53= 0,99999999999999988897769753748435. Жирным шрифтом помечены верные цифры, соответствующие значащим десятичным цифрам максимального пятнадцатизначного дробного десятичного числа.

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

    Для примера возьмем компьютер с 8-ми разрядной мантиссой. Гарантированное количество значащих десятичных цифр, которое можно представить в 8-ми разрядной машинной мантиссе равно n ≤ ⌊0.3*8⌋=2. Пусть нам дано число 0.0012. Это число в двоичном виде будет равно ≈ 0.00000000010011101010010. Округлим это число до 8 значащих цифр, количество которых соответствует размеру разрядной сетки машинной мантиссы. Получим число 0.00000000010011101= 0.00119781494140625≈0.0012. Нормализуем это число, поместив в машинную мантиссу все значащие цифры мантиссы числа. Получим 0.00000000010011101010010= 0.10011101*2^-9 = 0,61328125*2^-9=0,00119781494140625. Как мы видим, значение числа не изменилось после нормализации. Точность представления числа также не изменилась, т.к. количество значащих цифр после нормализации осталось неизменным. Мы просто получили другую форму записи одного и того же числа.
    В случае если при нормализации двоичного числа окажется, что количество сдвигов старшей значащей цифры числа превышает количество разрядов машинной области, которая предназначена для записи порядка характеристики числа, то число не может быть записано в нормализованном виде. В этом случае происходит потеря точности за счет того, что часть, или все значащие цифры числа оказываются за пределами разрядной сетки машинной мантиссы.

    В том случае, когда в результате арифметической операции получено двоичное число, все значащие цифры которого расположены в пределах машинной мантиссы, нормализация результата, с точки зрения арифметики, не имеет смысла.

    Например, пусть мы имеем компьютер с 8-ми разрядной машинной мантиссой, в котором виртуальная точка размещена перед старшим разрядом мантиссы. Найдем разность двух двоичных чисел: 0.10110000-0.10010011=0.00011101. Значащие цифры разности полностью поместились в разрядную сетку машинной мантиссы. Десятичный эквивалент этой разности будет равен 0.6875-0.57421875=0.11328125. Нормализуем число 0.00011101. Будем иметь 0.00011101=0.11101*2^-3=0.90625*2^-3=0.11328125. Мы видим, что нормализация никак не изменила значения разности чисел и поэтому в дальнейших вычислениях эти две записи результата, с точки зрения математики, эквивалентны.

    СУХОЙ ОСТАТОК


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

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

    Положение виртуальной точки никак не влияет на точность представления числа.

    Точность представления двоичного числа зависит от количества значащих цифр мантиссы, которое можно записать в машинное слово.

    Все двоичные числа являются эквивалентом представимых десятичных чисел. Десятичные числа не все являются представимыми в машинном слове. Десятичные действительные числа, в основном, могут быть представлены в двоичном виде приближенно, в то время как все двоичные числа могут быть представлены в десятичном виде точно.

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

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

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

    В машинной мантиссе с m разрядами можно гарантированно представить десятичное число, количество верных цифр в котором n≤⌊0.3m⌋.

    Нормализация двоичных чисел никак не меняет значения числа, если она осуществляется без округления.

    Нормализация не влияет на точность представления числа, если она осуществляется без округления.

    ИСТОЧНИКИ


    1. «Что нужно знать про арифметику с плавающей запятой»
    2. Всё, точка, приплыли! Учимся работать с числами с плавающей точкой и разрабатываем альтернативу с фиксированной точностью десятичной дроби.
    3. «Компенсация погрешностей при операциях с числами с плавающей запятой»
    4. «Вычисления с плавающей точкой: можно ли доверять результатам?»
    5. Wikipedia
    6. www.softelectro.ru/ieee754.html
    7. «Нужна ли нормализация в числах с плавающей точкой»
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 54

      0
      В идеале, количество значащих цифр двоичной мантиссы числа должно быть равно количеству разрядов машинной мантиссы.
      Не «равно», а «не больше».
      И это всё очевидные вещи. Для кого эта статья? Какую цель она преследует? Это уже пятая (шестая?) статья «цикла». И в каждой статье речь всегда об одном и том же. Зачем?
        0
        Исправил. Речь идет о приближенных числах.
          0
          И в каждой статье речь всегда об одном и том же. Зачем?

          Вы правы, речь идет об одном и том же — о числах с плавающей точкой. А статьи мои о том, что не существует особенной компьютерной арифметики. Существует классическая арифметика с определенными ограничениями, которые надо учитывать при решении арифметических задач на компьютере. И это не тавтология. В классическом труде David Goldberg «What Every Computer Scientist Should Know About Floating-Point Arithmetic» в представлении ЧПТ: b^p x M, утверждается, что знак умножить в этом выражении таковым не является. А это делает представление о ЧПТ несколько искусственным.
          0
          Тег «Python» откуда?
            –3
            Другие языки: С, С++, Java, которые оперируют с веществеными числами, в поле тегов не вместились.
              +3
              Потому что арифметика с плавающей точкой вообще не имеет отношения к языкам.
                –1
                А как же 1,2,3 и т.д.
                  +1
                  По первой ссылке language-specific вопрос, который вы в своей статье не рассматриваете, по двум другим — разжёвывание стандарта IEEE 754, просто в тематических сообществах.
            0
            Вы упоминаете про бесконечные представления десятичных чисел, сколько гарантированно правильных чисел при 8 разрядной мантисе у 1/5 (0.2)?
              0
              n≤⌊0.3*8⌋=2. Преобразуем ваше число в 8-разрядное двоичное: 0.2=0.210 ≈ 0.0011001101≈ 0.2001953125≈0.20. Итого, 2 верные десятичные цифры в 8-разрядном двоичном представлении десятичного числа.
                0
                Ну не две, а четрые, но кто-то давал ГАРАНТИИ на большее, нет?
                  0
                  Хотя, наверное я гоню, n=2 это 2 разряда, ну будем считать, что всё работает, но честно говоря мне кажется что может быть ситуация, когда будет не больше, а меньше и тогда получим девятки и минус самый старший разряд.
                    0
                    Не совсем понял.
                    Максимальное десятичное число с n=2 это 0.99. В 8-ми разрядной мантиссе максимальное число равно 11111111*2^-8=255*2^-8= 0,99609375. В нем 2 верных числа. Числа, которые меньше 0.99 могут быть гарантированно представлены в данной мантиссе.
                      +1
                      Я говорю про границу перехода в разряде.
                      0.09+0.01=0.10 погрешность в сотых, изменяет десятичный разряд.
                      Более того, сколь угодно малая погрешность может изменить ВСЕ разряды
                      0.19999999999999999999999999999999999999999 + маленькая погрешность и 0.20000000000000000…
                      Либо в меньшую сторону:
                      0.2000000000000000000000000000000000000000 — маленькая погрешность и 0.1999999999999999…
                      Погрешность же, может может вноситься не операциями, а просто невозможностью представить в виде конечного числа, конечное десятичное. Что непонятно?!
                        0
                        0.2 = 0.1(9)
                        Итого в представлении числа 0.2 в виде 0.19999999999999999999999999999999999999999 все цифры верные.
                          0
                          Цифры у нас 2 и 0, во втором случае 1 и 9. Мы ведь про цифры говорим, а не про предел числа?
                            0
                            Насколько я понимаю про конкретные цифры говорите только вы, в этом и проблема и недопонимание :)
                            Я не вижу точного определения «верных цифр», но у вас с автором они различаются. У автора это как раз что-то вроде предела.
                            По большому счёту ни одной верной цифры, в вашем понимании, арифметика с плавающей точкой гарантировать не может.
                              0
                              Цитирую:
                              = 9007199254740991*2^-53= 0,99999999999999988897769753748435. Жирным шрифтом помечены верные цифры, соответствующие значащим десятичным цифрам максимального пятнадцатизначного дробного десятичного числа.
                              Здесь автор не говорит про конкретные цифры?

                              В моём понимании именно так и есть, вы попали в точку.
                                0
                                Этот пример, приведенный в статье, является иллюстрацией правомерности представления чисел с плавающей точкой в виде целочисленной мантиссы со сдвинутой виртуальной точкой в начало мантиссы. На самом деле, если рассматривать максимальное десятичное 15 разрядное число, то мы получим:
                                0,999999999999999= 0.999999999999999000799277837359, в котором 15 значащих цифр совпадают с первоначальным числом. Это для формата doable/
                            +1
                            Вообще автор утверждает, что если взять дробное десятичное число, перевести в двоичное, усечь мантису, потом обратно, то мы сверяя цифра за цифрой получим сначала полное совпадение, потом начнутся разночтения, и количество совпадений можно посчитать по формуле. Ни о каких точностях чисел тут не идёт речь вообще, речь идёт чисто о количестве «правильных» цифр. Я же утверждаю, что в общем случае это — неверно.
                    0
                    А как вы так перевели? у меня получается вот: 0.00110011=0.19921875 итого 1 разряд точен.
                      0
                      0.2 = 0.00110011001100110011001100110… Округляем до 8 значащих цифр и получаем≈0.0011001101. Вы округлили число до 8 знака после точки. Это случай без нормализации.
                        0
                        В выкладках вы упомнинаете о округлении, в качестве негативного фактора — уменьшается точность.

                        Округление двоичных чисел приводит к уменьшению учитываемых верных цифр в округленном числе и к изменению неверных цифр в его десятичном эквиваленте


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

                        Процедура нормализации никак не меняет значение числа, а следовательно и точность его представления.

                        Каким боком вообще тут округление? Не говоря уже вот про такую дичь:
                        0.2=0.210

                          0
                          Каким боком вообще тут округление? Не говоря уже вот про такую дичь:
                          0.2=0.210

                          Это чисто техническая ошибка. Здесь 10, это система счисления.
                          Что касается округления, то при разложении несоизмеримого десятичного числа в двоичное, в компиляторе обычно происходит округление до последней младшей цифры, которая помещается в машинную мантиссу.
                            0
                            Да не важно, на самом деле округление, можно так подобрать мантису, что оно не будет оказывать влияния, но мой пример останется тем же. Ответьте на письма в самом низу, которые вы игнорируете.
                          0
                          Я не понял какие значащие 8 чисел вы берёте, потому что у вас 10 бит после точки, ну пусть учитывается и то что перед точкой, тогда 7 должно быть после точки.
                        –1
                        Ну пусть даже я взял мало разрядов (тут не 8, а 12): 0.001100110011 = 0.19995117
                        Я вас не арифметике учу, а спрашиваю про простую суть, как вы гарантируете разряды для таких случаев, ведь точность чисел может быть в плюс, а может и в минус, и если мы перешагиваем границу, то идут лесом все старшие рязряды. На мой взгляд, можно хоть как-то гарантировать точность в смысле отклонения значения, но «точные разряды» это совершенно из другой оперы.
                        Например 0.999 999 999 9 + небольшая неточность в 0.000 000 000 1 и «точные разряды» и «верные цифры» посыпались.
                          0
                          Я не понял какие значащие 8 чисел вы берёте

                          Хорошо, хоть вы и пишете:
                          Это случай без нормализации.

                          10 бит у вас может получиться только ПОСЛЕ нормализации:
                          0.0011001100 10бит
                          0.11001100 <-сдвинули получилось 8 бит + степень
                          Вот, конкретно только что влепленный минус в вышестоящее сообщение.

                          Пусть будет «ваша» мантиса, в этом примере 10 бит, что не правильно в вычислениях?
                          0.001100110011 = 0.19995117

                            0
                            10 бит у вас может получиться только ПОСЛЕ нормализации:
                            0.0011001100 10бит

                            Да, после нормализации получается 8 бит мантиссы. Больше не поместится в 8 разрядную машинную мантиссу.
                            0.11001100 <-сдвинули получилось 8 бит + степень
                            Вот, конкретно только что влепленный минус в вышестоящее сообщение.

                            Влепленный минус в чем? В том, что при нормализации надо корректировать порядок характеристики? Ну, так и да.
                            что не правильно в вычислениях?
                            0.001100110011 = 0.19995117

                            В этих вычислениях все правильно. Только количество разрядов машинной мантиссы в вашем примере не 8, а 10. Более того, чем больше разрядов двоичной мантиссы вы будете учитывать, тем более точно будет представляться десятичный эквивалент этого числа.
                              0
                              Если всё правильно тогда сколько правильных цифр для 0.2, при 10битной мантисе и результате 0.19995117?
                          0
                          А при 9 разрядном представлении будет 0.00110011001 или в десятичной системе 0.19970703125
                          Итого сколько верных десятичных цифр?
                            0
                            Или я неправильно округлил двоичное число?
                              0
                              Тогда возьмём 10 разрядное представление :) Тут должно быть 3 верные десятичные цифры.
                              При преобразовании туда сюда получим что-то типа 0.199951171875
                              Сколько тут верных?
                                0
                                Округлим до трех десятичных цифр и получим 0.199951171875≈0.200. Здесь три верные цифры
                                0
                                Дело в том, что усекать или округлять, в принципе, не имеет значения, мы же рассматриваем общий случай, а значит, какие бы мы параметры не подобрали, это будет всего лишь одиним из вероятных вариантов. Например (я буду в своих битах считать, а не после нормализации, как автор):
                                0.001100110011 = 0.19995117 тут 12 бит после запятой, сделаем меньше:
                                0.0011001100 = 0.20019531 тут 10 бит
                                0.00110011 = 0.19921875 тут 8 бит
                                при 8 и 12 битах округление совпадает с отсечением, потому что дальше 2 нуля, при 9 битах тоже, а вот при 10 битах округление даст какой-то результат. Таким образом можно рассматривать 8 и 12 бит и вопросы будут все те же самые и можно не заострять внимание на округление двоичных чисел.

                                И да, я думаю что вы неправильно округлили: 0.00110011001(1), по идее должно округляться до 0.00110011010()

                                  0
                                  Когда десятичное число конвертируется в двоичный код, в основном мы получаем двоичное число, в котором количество значащих цифр превышает разрядную сетку машинной мантиссы. Мы вынуждены округлять такое число. В результате округления мы получаем приближенное двоичное число, в котором цифры, не вошедшие в разрядную сетку машинной мантиссы, усекаются. Десятичное чило, которое можно было представить с любой заданной точностью в двоичном виде, в результате округления его двоичного эквивалента, меняет свое значение. По сравнению с первоначальным числом мы получаем в результате преобразований десятичное число, которое точно представляет округленное двоичное число. Но оно содержит значительно больше десятичных цифр, чем первоначальное десятичное число. Чтобы не рассматривать вновь появившиеся цифры, новое десятичное число округляют. Это новое, уже третье значение десятичного числа будет приближенным числом, по отношению ко второму.
                                  Поэтому к такому числу применим аппарат приближенных вычислений. Согласно теории приближенных вычислений, приближенное (в широком смысле) число содержит как верные, так и неверные цифры. Подчеркну, что понятия верных и неверных цифр имеет смысл только в приближенных числах. Поэтому 0.001100110011 = 0.19995117≈0.2, где 2 — верная цифра.
                                    0
                                    Чтобы не рассматривать вновь появившиеся цифры, новое десятичное число округляют. Это новое, уже третье значение десятичного числа будет приближенным числом

                                    Я вижу вы на своей волне, больше мне сказать, в общем-то — нечего, поскольку мои аргументы не опровергались. Можете считать 0.199 (если это была продукция от 0.2) за 0.2, а 0.199 (как изначальное значение) за 0.19 любым магическим способом, я «умываю руки».
                                      0
                                      Можете считать 0.199 (если это была продукция от 0.2) за 0.2

                                      В качестве ликбеза. А за какое число надо считать 0.199, если оно является продуктом числа 0.2?
                                      а 0.199 (как изначальное значение) за 0.19 любым магическим способом,

                                      Это в каких моих рассуждениях вы такое утверждение нашли?
                                      0
                                      Значащие цифры в учении о приближенных вычислениях это цифры, кроме нуля, а также и ноль в том случае, если он стоит между другими значащими цифрами. [1]
                                      Точность вычисления в вычислительной математике определяется количеством цифр результата, заслуживающих доверия, а не числом десятичных знаков после запятой (см. Березин И.С., Жидков Н.П. Методы вычислений. –М., 1966. –Т. 1. – 632 с.)
                                  0
                                  Здесь n≤⌊0.39=2⌋. Округляем до 2 десятичных знаков и получаем 0.19970703125≈ 0.20 Здесь гарантированно два верных знака.
                                    0
                                    Описка. Должно быть n≤⌊0.3*9⌋=2
                              +1
                              Я Вам писал уже в комментариях к предыдущей статье, что, выдумывая какое-то своё учение о верных цифрах вместо хорошо известного и великолепно исследованного понятия погрешности, Вы сами себя запутываете.
                                0
                                Вы мне льстите. К моему сожалению:), учение о верных цифрах и погрешностях в учебниках о приближенных вычислениях рассматриваются в одном разделе. Погрешности являются следствием наличия неверных цифр.
                                А поскольку числа с плавающей точкой в основном приближенные, то к ним в полной мере применим и аппарат прближенных вычислений.
                                А статью я написал главным образом потому, что ни в русскоязычной ни в англоязычной литературе не отражена четкая связь между точностью (погрешностью) представления десятичны дробных чисел с размерностью разрядной сетки машинной мантиссы. Даже в таких авторитетных источниках как 1, 2 нет ответа на этот вопрос.
                                  0
                                  Погрешность – это фундаментальная характеристика любой измеряемой величины, и только одна из её компонентов связана с записью числа в виде цифр.

                                  Источники [1] и [2] описывают двоичное представление вещественных чисел и вообще не касаются чрезмерно любимой Вами десятичной системы.

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

                                  Когда вы записали “жульническое” число 0.2, то в действительности это значит только то, что вы заведомо ограничились погрешностью представления 0.05 (половина цены младшего разряда), и рассуждать о более младших разрядах не имеет смысла.
                                    0
                                    Погрешность – это фундаментальная характеристика любой измеряемой величины, и только одна из её компонентов связана с записью числа в виде цифр.

                                    Написано хлестко, только смысл фразы не ясен. С «фундаментальной характеристикой измеряемой величины» не спорю. А вот про компоненту не понятно. Это относится к фундаментальной характеристике или к измеряемой величине? И как можно число записать без цифр или других символов, однозначно их заменяющих?
                                    Источники [1] и [2] описывают двоичное представление вещественных чисел.

                                    А вещественные числа в какой системе первоначально представляются?
                                    и вообще не касаются чрезмерно любимой Вами десятичной системы

                                    Тут не только меня надо в этом винить. Физики и математики свои уравнения почему-то привыкли решать в десятичной системе счисления. Бухгалтера зарплату тоже считают почему-то в десятичной системе.
                                    десятичным числам, непредставимым в двоичной системе с выбранной для расчётов точностью, практически неоткуда появиться в жизни современного человека, так как первоисточником почти всех прецизионных измерений являются двоичные датчики.
                                    Мне трудно представить, что человечество оперирует исключительно данными двоичных датчиков. Видимо не дотягивает до современного человека.
                                    Можно, если угодно, смотреть на такие числа, как на некий артефакт, позволяющий нам руками записывать на бумаге значения, несуществующие в окружающем нас цифровом двоичном мире (например, упомянутое Вами число 0.2)

                                    Отсюда следует, что число 0.2, все таки существует, а вот его значения в окружающем мире не существует. Вернее существует, но только, не в нашем мире, а в цифровом.

                                    Когда вы записали “жульническое” число 0.2, то в действительности это значит только то, что вы заведомо ограничились погрешностью представления 0.05 (половина цены младшего разряда), и рассуждать о более младших разрядах не имеет смысла.

                                    Чем же число 0.2 вам так насолило, что вы его называете «жульническим»? Не потому ли, что оно никак не вписывается в ваш двоичный мир?
                                    Когда я записал число 0.2, предполагая, что это такая часть от 10 человек, равная 2 человекам, то имел ввиду целых человеков. Т.к. трудно себе представить ошибку в 0.05 человека.

                                      0
                                      Написано хлестко, только смысл фразы не ясен. С «фундаментальной характеристикой измеряемой величины» не спорю. А вот про компоненту не понятно. Это относится к фундаментальной характеристике или к измеряемой величине? И как можно число записать без цифр или других символов, однозначно их заменяющих?

                                      Начнём с того, что значение можно представить, не записывая число. Например, аналоговым физическим параметром.

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

                                      А вещественные числа в какой системе первоначально представляются?

                                      В наше время, обычно в двоичной.

                                      Тут не только меня надо в этом винить. Физики и математики свои уравнения почему-то привыкли решать в десятичной системе счисления.

                                      Обычно решают на компьютере в двоичной системе.

                                      Бухгалтера зарплату тоже считают почему-то в десятичной системе.

                                      А эти работают исключительно с целыми числами (или с фиксированной точкой, что то же самое).

                                      Чем же число 0.2 вам так насолило, что вы его называете «жульническим»? Не потому ли, что оно никак не вписывается в ваш двоичный мир?

                                      Именно поэтому. А следовательно, не может легально появиться в порядочном обществе :)

                                      Когда я записал число 0.2, предполагая, что это такая часть от 10 человек, равная 2 человекам, то имел ввиду целых человеков. Т.к. трудно себе представить ошибку в 0.05 человека.

                                      Это арифметика целых чисел.
                                        0
                                        Начнём с того, что значение можно представить, не записывая число. Например, аналоговым физическим параметром.
                                        Представить себе можно, но передать кому-то это представление возможно только вместе с термометром. А уж в компьютер впихнуть ну никак не получится.
                                        Если же мы к этому термометру приделаем датчик для автоматического ввода его значения в компьютер, то прибавится инструментальная погрешность датчика и погрешность цифрового представления, равная половине младшего двоичного разряда.
                                        Погрешность цифрового представления здесь возникла относительно чего? Относительно аналогового физического параметра, который мы визуально наблюдаем или относительно некоего десятичного числа, которое мы хотели бы представить без погрешностей, ибо эта погрешность — бесплатный бонус, который может испортить нам жизнь.
                                        Когда я записал число 0.2, предполагая, что это такая часть от 10 человек, равная 2 человекам, то имел ввиду целых человеков. Т.к. трудно себе представить ошибку в 0.05 человека.

                                        Это арифметика целых чисел.
                                        Вся арифметика вытекает из взаимоотношений целых чисел. Хорошее целое число 3 и хорошее целое число 7 при делении дают отвратительное число 3/7, которым недовольны, как в приличном обществе так и в не очень:).
                                        Компьютеру совершенно все равно, с какой биографией ему подсовывают число. Он его врспринимает для себя точным, а уж потом портит, в силу своей природы.
                                          0
                                          Представить себе можно, но передать кому-то это представление возможно только вместе с термометром.

                                          Почему нельзя? Можно. Например, уровнем напряжения в проводе.

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

                                          Погрешность цифрового представления здесь возникла относительно чего?

                                          Относительно измеренного датчиком параметра.

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

                                          Без погрешностей ничего не бывает.

                                          Вся арифметика вытекает из взаимоотношений целых чисел. Хорошее целое число 3 и хорошее целое число 7 при делении дают отвратительное число 3/7, которым недовольны, как в приличном обществе так и в не очень:).

                                          Хорошее целое число 3 и хорошее целое число 7 при делении дают хорошее целое число 0.

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

                                          Это так, но мы-то умнее компьютера и знаем биографию.
                                            0
                                            Почему нельзя? Можно. Например, уровнем напряжения в проводе.

                                            Какие бы вы физические преобразования ни делали, компьютеру вы должны предъявить число, которое записывается цифрами 0...9 или 0,1 или любыми другими. Все прочее он не понимает.
                                            Без погрешностей ничего не бывает.
                                            Бывает, например, для некоторых операций с целыми числами. А когда погрешности неизбежны, их можно уменьшить или увеличить, выбирая те или иные параметры представления чисел в компьютере.
                                            Хорошее целое число 3 и хорошее целое число 7 при делении дают хорошее целое число 0.
                                            Скажите это продавцу, который рассыпает 3 кг. сахара по 7 пакетов. Он будет счастлив.
                                              0
                                              У продавца погрешность не менее 10 граммов. Он делит 3.00 на 7 и получает 0.42.

                                              А компьютер 9 не понимает, он понимает 0 и 1.
                                        0
                                        Добавлю, что в примере с термометром наибольшим компонентом погрешности, скорее всего, окажется методическая, связанная с тем, что висит он на стене дома и нагревается от него, и в этом свете все рассуждения, связанные с погрешностью перевода из десятичной системы в двоичную, окажутся ни к чему.

                                        Как правило, в реальности определяющее значение имеет либо методическая или инструментальная погрешности, не связанные с числовым представлением величины, либо погрешность вычислений, имеющая чисто компьютерную, двоичную природу.
                                          0
                                          Как правило, в реальности определяющее значение имеет либо методическая или инструментальная погрешности, не связанные с числовым представлением величины, либо погрешность вычислений, имеющая чисто компьютерную, двоичную природу.
                                          Вот на тех, кому важна погрешность вычислений, имеющая чисто компьютерную, двоичную природу и расчитана моя статья.
                                  0
                                  Есть форматы decimal floating point, например. Они стандартизированы, и их можно использовать. Вы рассматривали этот вариант?
                                    0
                                    Существует много способов получить точные результаты арифметических вычислений, но при решении конкретных задач приходится учитывать и другие факторы, такие, как скорость обработки, сложность алгоритма. Арифметика с плавющей точкой, реализованная в двоичном виде, сегодня самая простая и быстрая в реализации. Поэтому, не смотря на ее большие вычислительные погрешности, интерес к ней не уменьшается.

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

                                  Самое читаемое