All streams
Search
Write a publication
Pull to refresh
-1
0
Спиридонов Юрий Маркович @Innotor

Изобретатель

Send message
Значащие цифры в учении о приближенных вычислениях это цифры, кроме нуля, а также и ноль в том случае, если он стоит между другими значащими цифрами. [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 могут быть гарантированно представлены в данной мантиссе.
n≤⌊0.3*8⌋=2. Преобразуем ваше число в 8-разрядное двоичное: 0.2=0.210 ≈ 0.0011001101≈ 0.2001953125≈0.20. Итого, 2 верные десятичные цифры в 8-разрядном двоичном представлении десятичного числа.
И в каждой статье речь всегда об одном и том же. Зачем?

Вы правы, речь идет об одном и том же — о числах с плавающей точкой. А статьи мои о том, что не существует особенной компьютерной арифметики. Существует классическая арифметика с определенными ограничениями, которые надо учитывать при решении арифметических задач на компьютере. И это не тавтология. В классическом труде David Goldberg «What Every Computer Scientist Should Know About Floating-Point Arithmetic» в представлении ЧПТ: b^p x M, утверждается, что знак умножить в этом выражении таковым не является. А это делает представление о ЧПТ несколько искусственным.
Исправил. Речь идет о приближенных числах.
Другие языки: С, С++, Java, которые оперируют с веществеными числами, в поле тегов не вместились.
Вы правы. У меня приведен пример не совсем для 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 часа работы комплекса.
Полученный эффект, как мы видим, не связан с переполнением таймера в классическом понимании.

Information

Rating
Does not participate
Location
Минск, Минская обл., Беларусь
Registered
Activity