Значащие цифры в учении о приближенных вычислениях это цифры, кроме нуля, а также и ноль в том случае, если он стоит между другими значащими цифрами. [1]
Точность вычисления в вычислительной математике определяется количеством цифр результата, заслуживающих доверия, а не числом десятичных знаков после запятой (см. Березин И.С., Жидков Н.П. Методы вычислений. –М., 1966. –Т. 1. – 632 с.)
Этот пример, приведенный в статье, является иллюстрацией правомерности представления чисел с плавающей точкой в виде целочисленной мантиссы со сдвинутой виртуальной точкой в начало мантиссы. На самом деле, если рассматривать максимальное десятичное 15 разрядное число, то мы получим:
0,999999999999999= 0.999999999999999000799277837359, в котором 15 значащих цифр совпадают с первоначальным числом. Это для формата doable/
Когда десятичное число конвертируется в двоичный код, в основном мы получаем двоичное число, в котором количество значащих цифр превышает разрядную сетку машинной мантиссы. Мы вынуждены округлять такое число. В результате округления мы получаем приближенное двоичное число, в котором цифры, не вошедшие в разрядную сетку машинной мантиссы, усекаются. Десятичное чило, которое можно было представить с любой заданной точностью в двоичном виде, в результате округления его двоичного эквивалента, меняет свое значение. По сравнению с первоначальным числом мы получаем в результате преобразований десятичное число, которое точно представляет округленное двоичное число. Но оно содержит значительно больше десятичных цифр, чем первоначальное десятичное число. Чтобы не рассматривать вновь появившиеся цифры, новое десятичное число округляют. Это новое, уже третье значение десятичного числа будет приближенным числом, по отношению ко второму.
Поэтому к такому числу применим аппарат приближенных вычислений. Согласно теории приближенных вычислений, приближенное (в широком смысле) число содержит как верные, так и неверные цифры. Подчеркну, что понятия верных и неверных цифр имеет смысл только в приближенных числах. Поэтому 0.001100110011 = 0.19995117≈0.2, где 2 — верная цифра.
10 бит у вас может получиться только ПОСЛЕ нормализации:
0.0011001100 10бит
Да, после нормализации получается 8 бит мантиссы. Больше не поместится в 8 разрядную машинную мантиссу.
0.11001100 <-сдвинули получилось 8 бит + степень
Вот, конкретно только что влепленный минус в вышестоящее сообщение.
Влепленный минус в чем? В том, что при нормализации надо корректировать порядок характеристики? Ну, так и да.
что не правильно в вычислениях?
0.001100110011 = 0.19995117
В этих вычислениях все правильно. Только количество разрядов машинной мантиссы в вашем примере не 8, а 10. Более того, чем больше разрядов двоичной мантиссы вы будете учитывать, тем более точно будет представляться десятичный эквивалент этого числа.
Каким боком вообще тут округление? Не говоря уже вот про такую дичь:
0.2=0.210
Это чисто техническая ошибка. Здесь 10, это система счисления.
Что касается округления, то при разложении несоизмеримого десятичного числа в двоичное, в компиляторе обычно происходит округление до последней младшей цифры, которая помещается в машинную мантиссу.
0.2 = 0.00110011001100110011001100110… Округляем до 8 значащих цифр и получаем≈0.0011001101. Вы округлили число до 8 знака после точки. Это случай без нормализации.
Не совсем понял.
Максимальное десятичное число с n=2 это 0.99. В 8-ми разрядной мантиссе максимальное число равно 11111111*2^-8=255*2^-8= 0,99609375. В нем 2 верных числа. Числа, которые меньше 0.99 могут быть гарантированно представлены в данной мантиссе.
И в каждой статье речь всегда об одном и том же. Зачем?
Вы правы, речь идет об одном и том же — о числах с плавающей точкой. А статьи мои о том, что не существует особенной компьютерной арифметики. Существует классическая арифметика с определенными ограничениями, которые надо учитывать при решении арифметических задач на компьютере. И это не тавтология. В классическом труде David Goldberg «What Every Computer Scientist Should Know About Floating-Point Arithmetic» в представлении ЧПТ: b^p x M, утверждается, что знак умножить в этом выражении таковым не является. А это делает представление о ЧПТ несколько искусственным.
Вы правы. У меня приведен пример не совсем для double. Мантисса дабла предполагает 53 значащих цифры, а в моем примере только 51. Видимо поэтому и расхождения.
Результаты вычислений существенно зависят от выбранного способа округления, от компилятора, оптимизации.
Скажите мне пожалуйста, какой из возможных вариантов округления производится в вашем алгоритме и на каком итерационном шаге? Тогда можно будет сравнивать результаты.
Когда производительность не критична, то можно использовать любые пакеты. Но бывают случаи, когда производительность и точность становятся во главе угла. См., например, статью пользователя MagisterLudi про проблемы американской ЗРК «Патриот», которая пропустила советскую ракету «керосинку»
Очевидно потому, что ваш процессор, либо накапливает сумму до 80 байт, а потом округляет до double, либо округляет после каждого шага итерации. У меня рассмотрен случай без округления, т.е. все цифры, которые не помещаются в разрядную сетку машинного слова просто отбрасываются (усекаются)
точные десятичные дроби в двоичном виде бесконечны и поэтому всегда записываются с погрешностью.
Не все, а только непредставимые.
А теперь по теме.В статье говорится:
За сто часов работы набегает 0.000000095×100×60×60×10=0.34 секунды
Однако, причина сбоя в комплексе Patriot связана не столько с накоплением с течением времени ошибок при работе с числами с плавающей точкой, сколько с природой самих real numbers. Если исходить из тех условий работы программы, которые представлены в отчете, то можно увидеть, что при достижении таймером числа 1048576, которое в 24-разрядном двоичном слове записывается как 000 100 000 000 000 000 000 000, следующая добавка в 0.1≈0.000 110 011 001 100 110 011 001 101 дает число, равное 100 000 000 000 000 000 000.000 1100110≈100 000 000 000 000 000 000.000=1048576. Т.е. дальнейшего накопления в счетчике не происходит. И достигается это значение за 1048576*0.1/60/60=29,127 часа работы комплекса.
Полученный эффект, как мы видим, не связан с переполнением таймера в классическом понимании.
Точность вычисления в вычислительной математике определяется количеством цифр результата, заслуживающих доверия, а не числом десятичных знаков после запятой (см. Березин И.С., Жидков Н.П. Методы вычислений. –М., 1966. –Т. 1. – 632 с.)
0,999999999999999= 0.999999999999999000799277837359, в котором 15 значащих цифр совпадают с первоначальным числом. Это для формата doable/
Поэтому к такому числу применим аппарат приближенных вычислений. Согласно теории приближенных вычислений, приближенное (в широком смысле) число содержит как верные, так и неверные цифры. Подчеркну, что понятия верных и неверных цифр имеет смысл только в приближенных числах. Поэтому 0.001100110011 = 0.19995117≈0.2, где 2 — верная цифра.
Да, после нормализации получается 8 бит мантиссы. Больше не поместится в 8 разрядную машинную мантиссу.
Влепленный минус в чем? В том, что при нормализации надо корректировать порядок характеристики? Ну, так и да.
В этих вычислениях все правильно. Только количество разрядов машинной мантиссы в вашем примере не 8, а 10. Более того, чем больше разрядов двоичной мантиссы вы будете учитывать, тем более точно будет представляться десятичный эквивалент этого числа.
Это чисто техническая ошибка. Здесь 10, это система счисления.
Что касается округления, то при разложении несоизмеримого десятичного числа в двоичное, в компиляторе обычно происходит округление до последней младшей цифры, которая помещается в машинную мантиссу.
Максимальное десятичное число с n=2 это 0.99. В 8-ми разрядной мантиссе максимальное число равно 11111111*2^-8=255*2^-8= 0,99609375. В нем 2 верных числа. Числа, которые меньше 0.99 могут быть гарантированно представлены в данной мантиссе.
Вы правы, речь идет об одном и том же — о числах с плавающей точкой. А статьи мои о том, что не существует особенной компьютерной арифметики. Существует классическая арифметика с определенными ограничениями, которые надо учитывать при решении арифметических задач на компьютере. И это не тавтология. В классическом труде David Goldberg «What Every Computer Scientist Should Know About Floating-Point Arithmetic» в представлении ЧПТ: b^p x M, утверждается, что знак умножить в этом выражении таковым не является. А это делает представление о ЧПТ несколько искусственным.
Скажите мне пожалуйста, какой из возможных вариантов округления производится в вашем алгоритме и на каком итерационном шаге? Тогда можно будет сравнивать результаты.
Не все, а только непредставимые.
А теперь по теме.В статье говорится:
Однако, причина сбоя в комплексе Patriot связана не столько с накоплением с течением времени ошибок при работе с числами с плавающей точкой, сколько с природой самих real numbers. Если исходить из тех условий работы программы, которые представлены в отчете, то можно увидеть, что при достижении таймером числа 1048576, которое в 24-разрядном двоичном слове записывается как 000 100 000 000 000 000 000 000, следующая добавка в 0.1≈0.000 110 011 001 100 110 011 001 101 дает число, равное 100 000 000 000 000 000 000.000 1100110≈100 000 000 000 000 000 000.000=1048576. Т.е. дальнейшего накопления в счетчике не происходит. И достигается это значение за 1048576*0.1/60/60=29,127 часа работы комплекса.
Полученный эффект, как мы видим, не связан с переполнением таймера в классическом понимании.