Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

В численном анализе , катастрофическая отмена [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 приведены ниже , а вычитание с плавающей запятой точно вычисляется по лемме Стербенца.xyy - x

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

Доброкачественная отмена [ править ]

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

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

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

Ссылки [ править ]

  1. ^ Мюллер, Жан-Мишель; Бруни, Николас; де Динешен, Флоран; Жаннерод, Клод-Пьер; Джолдес, Миоара; Лефевр, Винсент; Мелькионд, Гийом; 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)
  2. ^ a b c Голдберг, Дэвид (март 1991 г.). «Что должен знать каждый компьютерный ученый об арифметике с плавающей запятой» . ACM Computing Surveys . Нью-Йорк, штат Нью-Йорк, США: Ассоциация вычислительной техники. 23 (1): 5–48. DOI : 10.1145 / 103162.103163 . ISSN 0360-0300 . Проверено 17 сентября 2020 .