Потеря точности в численном анализе
В численном анализе катастрофическое сокращение [1] [2] представляет собой явление, при котором вычитание хороших приближений двух соседних чисел может привести к очень плохому приближению к разнице исходных чисел.
Например, если есть два стержня, один длинный, а другой длинный, и они измерены линейкой, которая хороша только до сантиметра, то приближения могут получиться и . Это могут быть хорошие приближения, в относительной погрешности , к истинным длинам: приближения имеют погрешность менее 2% от истинных длин, .
Однако, если вычесть приблизительные длины, то разница составит , хотя истинная разница между длинами составляет . Разница приближений, , имеет погрешность почти в 100% от величины разницы истинных значений, .
Катастрофическое погашение не зависит от того, насколько велики входные данные — оно применимо как к большим, так и к малым входным данным. Оно зависит только от того, насколько велика разница , и от погрешности входных данных. Точно такая же ошибка возникнет при вычитании из как приближений к и , или при вычитании из как приближений к и .
Катастрофическое сокращение может произойти, даже если разница вычисляется точно, как в примере выше — это не свойство какого-либо конкретного вида арифметики, например, арифметики с плавающей точкой ; скорее, это присуще вычитанию, когда входные данные сами являются приближениями. Действительно, в арифметике с плавающей точкой, когда входные данные достаточно близки, разница с плавающей точкой вычисляется точно, согласно лемме Стербенца — нет ошибки округления, вносимой операцией вычитания с плавающей точкой.
Формальный анализ
Формально катастрофическое сокращение происходит из-за того, что вычитание плохо обусловлено на близких входах: даже если приближения и имеют малые относительные погрешности и от истинных значений и , соответственно, относительная погрешность разности приближений от разности истинных значений обратно пропорциональна разности истинных значений:
Таким образом, относительная погрешность точного отличия приближений от отличия истинных значений равна
которые могут быть сколь угодно большими, если истинные значения и близки.
В численных алгоритмах
Вычитание соседних чисел в арифметике с плавающей точкой не всегда приводит к катастрофическому сокращению или даже к любой ошибке — по лемме Стербенца , если числа достаточно близки, то разница с плавающей точкой точна. Но сокращение может усилить ошибки во входных данных, которые возникли из-за округления в другой арифметике с плавающей точкой.
Пример: Разность квадратов
При наличии чисел и наивная попытка вычислить математическую функцию
с помощью арифметики с плавающей точкой
подвержена катастрофическому сокращению, когда и близки по величине, поскольку вычитание может выявить ошибки округления при возведении в квадрат. Альтернативное разложение , оцененное с помощью арифметики с плавающей точкой , позволяет избежать катастрофического сокращения, поскольку оно позволяет избежать внесения ошибки округления, ведущей к вычитанию. [2]
Например, если
и , то истинное значение разности
равно . В двоичной арифметике IEEE 75464 оценка альтернативного факторинга
дает точный результат (без округления), но оценка наивного выражения
дает число с плавающей точкой , в котором менее половины цифр являются правильными, а другие (подчеркнутые) цифры отражают пропущенные члены , потерянные из-за округления при вычислении промежуточных квадратов значений.
Пример: комплексный арксинус
При вычислении комплексной функции арксинуса может возникнуть соблазн использовать логарифмическую формулу напрямую:
Однако предположим, что для . Тогда и ; назовем разницу между ними — очень маленькую разницу, почти нулевую. Если вычисляется в арифметике с плавающей точкой, давая
с любой ошибкой , где обозначает округление с плавающей точкой, затем вычисление разницы
из двух соседних чисел, оба очень близкие к , может усилить ошибку в одном входе в раз — очень большой раз, поскольку был близок к нулю. Например, если , истинное значение приблизительно равно , но использование наивной логарифмической формулы в двоичной арифметике IEEE 754 может дать , при этом только пять из шестнадцати цифр будут правильными, а все остальные (подчеркнутые) неверны.
В случае для использование тождества позволяет избежать сокращения, поскольку но , поэтому вычитание фактически является сложением с тем же знаком, которое не сокращается.
Пример: преобразование системы счисления
Числовые константы в программах часто записываются в десятичной системе счисления, например, во фрагменте C для объявления и инициализации переменной IEEE 754 binary64 с именем . Однако не является числом с плавающей точкой binary64; ближайшее число, которое будет инициализировано в этом фрагменте, — . Хотя преобразование основания из десятичного числа с плавающей точкой в двоичное число с плавающей точкой приводит лишь к небольшой относительной ошибке, катастрофическое сокращение может усилить ее до гораздо большей:double x = 1.000000000000001;
x
x
double x = 1.000000000000001 ; // округлено до 1 + 5*2^{-52} double y = 1.000000000000002 ; // округлено до 1 + 9*2^{-52} double z = y - x ; // разница составляет ровно 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: location (link) - ^ abc Goldberg, David (март 1991 г.). «Что каждый специалист по информатике должен знать об арифметике с плавающей точкой». ACM Computing Surveys . 23 (1). Нью-Йорк, штат Нью-Йорк, США: Ассоциация вычислительной техники: 5–48. doi : 10.1145/103162.103163. ISSN 0360-0300. S2CID 222008826. Получено 17 сентября 2020 г.