stringtranslate.com

Катастрофическая отмена

В численном анализе катастрофическое сокращение [1] [2] — это явление, при котором вычитание хороших приближений двух соседних чисел может дать очень плохое приближение к разнице исходных чисел.

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

Однако если вычесть приблизительные длины, разница составит , хотя истинная разница между длинами равна . Разница аппроксимаций погрешность составляет 100% от величины разницы истинных значений .

На катастрофическое аннулирование не влияет размер входных данных — оно одинаково применимо как к большим, так и к малым входным данным. Это зависит только от того, насколько велика разница и от погрешности входных данных. Точно такая же ошибка возникнет при вычитании из as приближений к и или при вычитании из as приближений к и .

Катастрофическое аннулирование может произойти, даже если разница вычислена точно, как в примере выше — это не свойство какого-либо конкретного вида арифметики, например арифметики с плавающей запятой ; скорее, оно присуще вычитанию, когда входные данные сами являются приближениями. Действительно, в арифметике с плавающей запятой, когда входные данные достаточно близки, разность с плавающей запятой вычисляется точно по лемме Штербенца - ошибка округления, вносимая операцией вычитания с плавающей запятой, не возникает.

Формальный анализ

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

Таким образом, относительная погрешность точного отличия приближений от разности истинных значений равна

который может быть сколь угодно большим, если истинные значения и близки.

В числовых алгоритмах

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

Пример: Разность квадратов

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

Например, если и , то истинное значение разницы равно . В бинарной64-арифметике IEEE 754 оценка альтернативного факторинга дает точный результат (без округления), но оценка простого выражения дает число с плавающей запятой , из которого менее половины цифр являются правильными, а остальные (подчеркнутые) цифры отражают недостающие члены , потерянные из-за округления при вычислении промежуточных значений квадратов.

Пример: комплексный арксинус.

При вычислении комплексной функции арксинуса может возникнуть соблазн напрямую использовать логарифмическую формулу:

Однако предположим, что для . Тогда и ; назовите разницу между ними — очень маленькая разница, почти нулевая. If оценивается в арифметических операциях с плавающей запятой, давая

с любой ошибкой , где обозначает округление с плавающей запятой, затем вычисляется разница

двух соседних чисел, оба очень близких к , может увеличить ошибку в одном входе в очень большой раз, поскольку она была почти равна нулю. Например, если , истинное значение приблизительно равно , но использование простой логарифмической формулы в двоичной64-арифметике IEEE 754 может дать , при этом только пять из шестнадцати цифр являются правильными, а остаток (подчеркнутый) - мусор.

В случае for использование идентичности позволяет избежать отмены, потому что но , поэтому вычитание фактически является сложением с тем же знаком, но не отменяется.

Пример: преобразование системы счисления

Числовые константы в программах часто записываются в десятичном формате, например, во фрагменте C double x = 1.000000000000001;для объявления и инициализации двоичной переменной IEEE 754 с именем x. Однако это не число с плавающей запятой в двоичном формате 64; ближайший из них, который будет инициализирован в этом фрагменте, — . Хотя преобразование системы счисления из десятичного числа с плавающей запятой в двоичное число с плавающей запятой приводит лишь к небольшой относительной ошибке, катастрофическая отмена может привести к гораздо большей ошибке:x

двойной х = 1.000000000000001 ; // округляем до 1 + 5*2^{-52} double y = 1.000000000000002 ; // округляем до 1 + 9*2^{-52} double z = y - x ; // разница ровно 4*2^{-52}              

Разница в том . Относительные ошибки from и from ниже , а вычитание с плавающей запятой вычисляется точно по лемме Штербенца.xyy - x

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

Доброкачественная отмена

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

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

[2]

Рекомендации

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