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

Пример LOS в случае вычисления двух форм одной и той же функции

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

Демонстрация проблемы [ править ]

Вычитание [ править ]

Эффект можно продемонстрировать с помощью десятичных чисел. В следующем примере демонстрируется катастрофическая отмена для десятичного типа данных с плавающей запятой с 10 значащими цифрами:

Рассмотрим десятичное число

х = 0,1234567891234567890

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

у = 0,1234567891

что довольно близко при измерении ошибки в процентах от значения. Если измерять по порядку точности, он сильно отличается. Значение "x" с точностью до10 × 10 −19 , а значение y имеет точность только до10 × 10 −10 .

Теперь произведем расчет

х - у = 0,1234567891234567890 - 0,1234567890000000000

Ответ с точностью до 20 значащих цифр:

0,0000000001234567890

Однако на 10-значном компьютере с плавающей запятой вычисление дает

0,1234567891 - 0,1234567890 = 0,0000000001

В обоих случаях результат имеет тот же порядок величины, что и входные данные (-20 и -10 соответственно). Во втором случае ответ, кажется, состоит из одной значащей цифры, что приведет к потере значимости. Однако в компьютерной арифметике с плавающей запятой все операции можно рассматривать как выполняемые над антилогарифмами , для которых правила для значащих цифр указывают, что количество значащих цифр остается таким же, как наименьшее количество значащих цифр в мантиссах . Обозначить это и представить ответ на 10 значащих цифр можно следующим образом:

 1.000 000 000 × 10 −10


Потеря значащих битов [ править ]

Пусть x и y - положительные нормализованные числа с плавающей запятой.

В вычитания х - у , г значимые биты теряются , где

для некоторых натуральных чисел p и q .

Обходные пути [ править ]

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

Одна из наиболее важных частей численного анализа - избежать или минимизировать потерю значимости в расчетах. Если основная проблема поставлена ​​правильно, должен существовать стабильный алгоритм ее решения.

Иногда умные уловки алгебры могут преобразовать выражение в форму, позволяющую обойти проблему. Один из таких приемов - использовать известное уравнение

Итак, с выражением умножьте числитель и знаменатель, дав

Теперь можно сократить выражение, чтобы исключить вычитание? Иногда может.

Например, выражение может потерять значащие биты, если оно намного меньше 1. Поэтому перепишите выражение как

или же

Неустойчивость квадратного уравнения [ править ]

Например, рассмотрим квадратное уравнение

с двумя точными решениями:

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

Случай , , будет служить для иллюстрации проблемы:

У нас есть

В реальной арифметике корни

В 10-значной арифметике с плавающей запятой:

Обратите внимание, что решение большей величины имеет точность до десяти цифр, но первая ненулевая цифра решения меньшей величины неверна.

Из-за вычитания, которое происходит в квадратном уравнении, он не является стабильным алгоритмом для вычисления двух корней.

Лучший алгоритм [ править ]

Тщательная реализация на компьютере с плавающей запятой сочетает в себе несколько стратегий для получения надежного результата. Предполагая, что дискриминант b 2 - 4 ac положителен, а b отличен от нуля, вычисление будет следующим: [1]

Здесь sgn обозначает знаковую функцию , где 1, если положительно, и -1, если отрицательно. Это позволяет избежать проблем с удалением между квадратным корнем из дискриминанта, гарантируя, что добавляются только числа с одинаковым знаком.

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

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

Обратите внимание на то, как отмена приводит к вычислению с точностью до 8 значащих цифр.

Однако представленная здесь вариантная формула дает следующее:

Обратите внимание на сохранение всех значащих цифр для .

Обратите внимание, что хотя приведенная выше формулировка позволяет избежать катастрофической отмены между и , остается форма отмены между членами и дискриминанта, которая все еще может привести к потере до половины правильных значащих цифр. [2] [3] Дискриминант должен быть вычислен в арифметике с удвоенной точностью результата, чтобы избежать этого (например, четверная точность, если конечный результат должен быть точным до полной двойной точности). [4] Это может быть в форме объединенной операции умножения-сложения . [2]

Чтобы проиллюстрировать это, рассмотрим следующее квадратное уравнение, адаптированное из Kahan (2004): [2]

Это уравнение имеет и корни

Однако при вычислении с использованием арифметики двойной точности IEEE 754, соответствующей от 15 до 17 значащих цифр точности, округляется до 0,0, а вычисленные корни равны

которые оба ложны после 8-й значащей цифры. И это несмотря на то, что на первый взгляд проблема требует только 11 значащих цифр точности для своего решения.

Другие примеры [ править ]

  • Функция expm1 вычисляет экспоненту минус 1 . При малых х , ехр ( х ) - 1 приведет к потере значимости в вычитании; использование специально разработанной функции помогает решить проблему.

См. Также [ править ]

  • Ошибка округления
  • Алгоритм суммирования Кахана
  • Карлсруэ Точная арифметика
  • Exsecant
  • Пример в викиучебнике: Отмена значащих цифр в числовых вычислениях

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

  1. ^ Пресса, Уильям Генри ; Фланнери, Брайан П .; Теукольский, Саул А .; Веттерлинг, Уильям Т. (1992). «Раздел 5.6: Квадратные и кубические уравнения» . Числовые рецепты на C (2-е изд.).
  2. ^ a b c Кахан, Уильям Мортон (2004-11-20). «О стоимости вычислений с плавающей запятой без сверхточной арифметики» (PDF) . Проверено 25 декабря 2012 .
  3. ^ Хайэм, Николас Джон (2002). Точность и устойчивость численных алгоритмов (2-е изд.). СИАМ . п. 10. ISBN 978-0-89871-521-7.
  4. ^ Хаф, Дэвид (март 1981). «Применение предложенного стандарта IEEE 754 для арифметики с плавающей запятой». Компьютер . IEEE . 14 (3): 70–74. DOI : 10.1109 / CM.1981.220381 .