В численном анализе , катастрофическая отмена [1] [2] является явление, вычитая хорошие приближения к двум близлежащим числам может дать очень плохое приближение к разности исходных чисел.
Например, предположим, что у вас есть две деревянные гвоздики, одна длинная, а другая длинная. Если вы измеряете их линейкой, которая хороша только до сантиметра, вы можете получить приближения и . В зависимости от ваших потребностей, они могут быть хорошие приближениями, в относительной погрешности , к истинной длине: приближения ошибочны менее чем на 2% от истинной длины, .
Однако, если вычесть приблизительную длину, вы получите , хотя истинная разница между длинами составляет . Разность приближений, является ошибкой на 100% от величины разности истинных значений, .
Катастрофическая отмена может произойти, даже если разница вычислена точно, как в приведенном выше примере - это не свойство какого-либо определенного вида арифметики, например арифметики с плавающей запятой ; скорее, это присуще вычитанию, когда входные данные сами являются приближениями. Действительно, в арифметике с плавающей запятой, когда входные данные достаточно близки, разность с плавающей запятой вычисляется точно по лемме Стербенца - нет ошибки округления, вносимой операцией вычитания с плавающей запятой.
Формальный анализ [ править ]
Формально катастрофическая отмена происходит потому, что вычитание плохо обусловлено на близлежащих входах: даже если приближения и имеют небольшие относительные ошибки и от истинных значений и , соответственно, относительная ошибка приблизительного отличия от истинного различия обратно пропорциональна истинному различию:
Таким образом, относительная погрешность точного отличия приближений от разности истинных чисел составляет
который может быть сколь угодно большим, если истинные входы и близки.
В численных алгоритмах [ править ]
Вычитание близких чисел в арифметике с плавающей запятой не всегда вызывает катастрофическое сокращение или даже любую ошибку - согласно лемме Стербенца , если числа достаточно близки, разница с плавающей запятой точна. Но отмена может усилить ошибки во входных данных, которые возникли из-за округления в другой арифметике с плавающей запятой.
Пример: разница квадратов [ править ]
При заданных числах и наивная попытка вычислить математическую функцию с помощью арифметики с плавающей запятой подлежит катастрофической отмене, когда и близки по величине, потому что вычитание усилит ошибки округления при возведении в квадрат. Альтернативное разложение на множители , оцениваемое арифметикой с плавающей запятой , позволяет избежать катастрофического удаления, поскольку оно позволяет избежать ошибки округления, ведущей к вычитанию. [2]
Например, если и , то истинное значение разницы составляет . В IEEE 754 binary64 арифметике оценка альтернативного факторизации дает точный результат (без округления), но оценка наивного выражения дает ближайшее к нему число с плавающей запятой , из которых только половина цифр верна, а другая половина (подчеркнута) мусор.
Пример: сложный арксинус [ править ]
При вычислении комплексной арксинусной функции может возникнуть соблазн использовать логарифмическую формулу напрямую:
Однако предположим, что для . Тогда и ; назовите разницу между ними - разница очень маленькая, почти нулевая. Если вычисляется в арифметике с плавающей запятой, давая
с любой ошибкой , где означает округление с плавающей запятой, затем вычисление разницы
двух близких чисел, оба очень близких к , может усилить ошибку в одном вводе в раз - очень большой коэффициент, потому что был почти нулевым. Например, если истинное значение равно приблизительно , но использование простой логарифмической формулы в IEEE 754 binary64 арифметика может дать только пять из шестнадцати цифр правильными, а остаток (подчеркнутый) - мусор.
В случае for использование идентификатора позволяет избежать отмены, потому что, но , поэтому вычитание фактически является сложением с тем же знаком, которое не отменяется.
Пример: преобразование Radix [ править ]
Числовые константы в программах часто записываются в десятичном double x = 1.000000000000001;
формате , например, в фрагменте C для объявления и инициализации переменной IEEE 754 binary64 с именем x
. Однако это не число с плавающей запятой binary64; Ближайший из них, который будет инициализирован в этом фрагменте, - это . Хотя преобразование системы счисления с десятичной точки с плавающей запятой в двоичную с плавающей запятой вызывает только небольшую относительную ошибку, катастрофическая отмена может усилить ее до гораздо большей:x
двойной x = 1.000000000000001 ; // округляем до 1 + 5 * 2 ^ {- 52} double y = 1.000000000000002 ; // округляем до 1 + 9 * 2 ^ {- 52} double z = y - x ; // разница ровно 4 * 2 ^ {- 52}
Разница есть . Относительные погрешности from и of from приведены ниже , а вычитание с плавающей запятой точно вычисляется по лемме Стербенца.x
y
y - x
Но даже несмотря на то, что входные данные являются хорошими приближениями, и даже несмотря на то, что вычитание вычисляется точно, разница приближений имеет относительную ошибку, превышающую разницу исходных значений, записанных в десятичном формате: катастрофическое отмена усиливает крошечную ошибку в преобразовании системы счисления в большую ошибку в выводе.
Доброкачественная отмена [ править ]
Отмена иногда полезна и желательна в числовых алгоритмах. Например, алгоритмы 2Sum и Fast2Sum полагаются на такую отмену после ошибки округления, чтобы точно вычислить, какая ошибка была в операции сложения с плавающей запятой как само число с плавающей запятой.
Функция , если оценивать ее наивно в точках , потеряет большую часть цифр при округлении . Однако эта функция сама по себе хорошо обусловленной на входах рядом . Переписав это как
Ссылки [ править ]
- ^ Мюллер, Жан-Мишель; Бруни, Николас; де Динешен, Флоран; Жаннерод, Клод-Пьер; Джолдес, Миоара; Лефевр, Винсент; Мелькионд, Гийом; Revol, Натали; Торрес, Серж (2018). Справочник по арифметике с плавающей точкой (2-е изд.). Gewerbestrasse 11, 6330 Cham, Швейцария: Birkhäuser. п. 102. DOI : 10.1007 / 978-3-319-76526-6 . ISBN 978-3-319-76525-9.CS1 maint: location (link)
- ^ a b c Голдберг, Дэвид (март 1991 г.). «Что должен знать каждый компьютерный ученый об арифметике с плавающей запятой» . ACM Computing Surveys . Нью-Йорк, штат Нью-Йорк, США: Ассоциация вычислительной техники. 23 (1): 5–48. DOI : 10.1145 / 103162.103163 . ISSN 0360-0300 . Проверено 17 сентября 2020 .