Катастрофическая отмена
В численном анализе катастрофическая отмена [1] [2] Это явление, при котором вычитание хороших приближений к двум соседним числам может дать очень плохое приближение к разнице исходных чисел.
Например, если имеется две шпильки, одна длинный и другой длинные и измеряются линейкой, допускающей точность только до сантиметра, то приближения могут оказаться неправильными. и . Это могут быть хорошие аппроксимации с относительной ошибкой истинных длин: аппроксимации погрешны менее чем на 2% от истинных длин, .
Однако если вычесть примерные длины, разница составит , хотя истинная разница между длинами равна . Разница приближений, , погрешность составляет почти 100% от величины разницы истинные ценности, .
На катастрофическое аннулирование не влияет размер входных данных — оно одинаково применимо как к большим, так и к малым входным данным. Это зависит только от того, насколько велика разница и от погрешности входных данных. Точно такая же ошибка возникнет при вычитании от как приближения к и , или вычитая от как приближения к и .
Катастрофическое аннулирование может произойти, даже если разница вычислена точно, как в примере выше — это не свойство какого-либо конкретного вида арифметики, например арифметики с плавающей запятой ; скорее, оно присуще вычитанию, когда входные данные сами являются приближениями. Действительно, в арифметике с плавающей запятой, когда входные данные достаточно близки, разность с плавающей запятой вычисляется точно по лемме Штербенца - ошибка округления, вносимая операцией вычитания с плавающей запятой, не возникает.
Формальный анализ
[ редактировать ]Формально катастрофическое сокращение происходит потому, что вычитание плохо обусловлено на соседних входах: даже если аппроксимации и имеют небольшие относительные ошибки и от истинных ценностей и , соответственно, относительная ошибка разности приближений по разности истинных значений обратно пропорциональна разнице истинных значений:
Таким образом, относительная погрешность точной разности приближений по разности из истинных ценностей является
которое может быть сколь угодно большим, если истинные значения и близки.
В числовых алгоритмах
[ редактировать ]Вычитание соседних чисел в арифметике с плавающей запятой не всегда приводит к катастрофической отмене или даже какой-либо ошибке — согласно лемме Штербенца , если числа достаточно близки, разница с плавающей запятой точна. Но отмена может усилить ошибки во входных данных, возникшие из-за округления в других арифметических операциях с плавающей запятой.
Пример: Разность квадратов
[ редактировать ]Данные числа и , наивная попытка вычислить математическую функцию с помощью арифметики с плавающей запятой подлежит катастрофической отмене, когда и близки по величине, поскольку вычитание может выявить ошибки округления при возведении в квадрат. Альтернативный факторинг , оценивается с помощью арифметики с плавающей запятой , позволяет избежать катастрофической отмены, поскольку позволяет избежать ошибки округления, приводящей к вычитанию. [2]
Например, если и , тогда истинное значение разницы является . В двоичной арифметике IEEE 754 двоичная64 оценка альтернативного факторинга дает точный результат (без округления), но оценивает наивное выражение дает число с плавающей запятой , из которых менее половины цифр являются правильными, а остальные (подчеркнутые) цифры отражают недостающие термины , теряется из-за округления при вычислении промежуточных квадратов значений.
Пример: комплексный арксинус.
[ редактировать ]При вычислении комплексной функции арксинуса может возникнуть соблазн напрямую использовать логарифмическую формулу:
Однако предположим для . Затем и ; назови разницу между ними — очень небольшая разница, почти нулевая. Если оценивается в арифметике с плавающей запятой, давая
с любой ошибкой , где обозначает округление с плавающей запятой, а затем вычисление разницы
из двух соседних номеров, оба очень близко , может усилить ошибку за один вход с коэффициентом — очень важный фактор, потому что был почти нулевым. Например, если , истинная стоимость примерно , но использование простой логарифмической формулы в двоичной64-арифметике IEEE 754 может дать , где только пять из шестнадцати цифр верны, а остальные (подчеркнуты) неверны.
В случае для , используя тождество избегает отмены, потому что но , поэтому вычитание фактически является сложением с тем же знаком, которое не отменяет.
Пример: преобразование системы счисления
[ редактировать ]Числовые константы в программах часто записываются в десятичном формате, например, во фрагменте C. double x = 1.000000000000001;
для объявления и инициализации переменной IEEE 754binary64 с именем x
.
Однако, не является числом с плавающей запятой в двоичном формате 64; ближайший, который x
будет инициализирован в этом фрагменте, .
Хотя преобразование системы счисления из десятичного числа с плавающей запятой в двоичное число с плавающей запятой приводит лишь к небольшой относительной ошибке, катастрофическая отмена может привести к гораздо большей ошибке:
double x = 1.000000000000001; // rounded to 1 + 5*2^{-52}
double y = 1.000000000000002; // rounded to 1 + 9*2^{-52}
double z = y - x; // difference is exactly 4*2^{-52}
Разница является .
Относительные ошибки x
от и из y
от оба ниже и вычитание чисел с плавающей запятой y - x
вычисляется точно по лемме Штербенца.
Но даже несмотря на то, что входные данные являются хорошими приближениями и даже если вычитание вычисляется точно, разница приближений имеет относительную ошибку более от разницы исходных значений, записанных в десятичном виде: катастрофическая отмена превратила крошечную ошибку при преобразовании системы счисления в большую ошибку в выводе.
Доброкачественная отмена
[ редактировать ]Отмена иногда полезна и желательна в числовых алгоритмах. Например, алгоритмы 2Sum и Fast2Sum полагаются на такую отмену после ошибки округления, чтобы точно вычислить ошибку в операции сложения с плавающей запятой как само число с плавающей запятой.
Функция , если оценивать наивно в баллах , потеряет большую часть цифр в округлении . Однако функция сам хорошо кондиционирован на входах вблизи . Переписав это как отмена эксплойтов в чтобы избежать ошибки из оценивается напрямую. [2] Это работает, потому что сокращение в числителе и сокращение в знаменателе противодействовать друг другу; функция достаточно хорошо обусловлено вблизи нуля, что дает хорошее приближение к , и таким образом дает хорошее приближение к .
Ссылки
[ редактировать ]- ^ Мюллер, Жан-Мишель; Бруни, Николас; из Динешена, Флоран; Жаннерод, Клод-Пьер; Джолдес, Миоара; Лефевр, Винсент; Мелькионд, Гийом; Револь, Натали ; Торрес, Серж (2018). Справочник по арифметике с плавающей запятой (2-е изд.). Gewerbestrasse 11, 6330 Шам, Швейцария: Биркхойзер. п. 102. дои : 10.1007/978-3-319-76526-6 . ISBN 978-3-319-76525-9 .
{{cite book}}
: CS1 maint: местоположение ( ссылка ) - ^ Jump up to: а б с Гольдберг, Дэвид (март 1991 г.). «Что должен знать каждый ученый-компьютерщик об арифметике с плавающей запятой» . Обзоры вычислительной техники ACM . 23 (1). Нью-Йорк, штат Нью-Йорк, США: Ассоциация вычислительной техники: 5–48. дои : 10.1145/103162.103163 . ISSN 0360-0300 . S2CID 222008826 . Проверено 17 сентября 2020 г.