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

Без названия [ править ]

На странице написано:

Примеры некорректных расчетов:

  • Вычитая два почти равных числа
  • Деление почти на ноль

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

Деление на небольшое ненулевое число не приводит к потере значимости. Это может (в зависимости от числителя) вызвать числовое переполнение, например умножение, сложение или вычитание. Это совсем другая и отдельная проблема от потери значения.

Вычитание почти равных чисел - единственный источник потери значимости.


Приведенная формула потери значимости дает неопределенные результаты для x <y. Не пропущено «при условии, что x> y» или это должно быть abs (1 - y / x)?


Я думаю, что эта страница - хорошее место, чтобы упомянуть катастропную отмену . Это уже упоминалось однажды кем-то другим, но могло быть неясным и неполным. 18:44, 13 марта 2007 г. Эдр (Обсуждение | вклад) m (Упомянутое «отмена») Цитаты, которые можно использовать, из книги Дэвида Голдберга « Что должен знать каждый компьютерный ученый об арифметике с плавающей запятой »

84.41.135.110 17:25, 4 июля 2007 г. (UTC)

Алгоритм Кахана [ править ]

Привет, а как насчет алгоритма Кахана .? —Предыдущий комментарий без подписи, добавленный 149.156.67.102 ( обсуждение ) 18:59, 14 октября 2009 г. (UTC)

Суджит Кадам, Университет Огайо, США [ править ]

Привет всем,

Это Суджит Кадам, изучающая степень магистра математики - вычислительная техника в Университете Огайо, США. Я хотел бы предложить несколько изменений на этой странице. Я думаю, что раздел «Лучший алгоритм» немного сбивает с толку и требует некоторых изменений в отношении примеров и используемых формул. Формула, используемая для «x1» и «x2» в этом разделе, верна, если коэффициент «b» в квадратном уравнении отрицательный. В нашем примере используемое квадратное уравнение имеет положительный коэффициент «b». Следовательно, в формуле это дает

- b + sqrt (b * b -4ac) = - 200 + sqrt (200 * 200 - 4 * 1 * - 0,000015)

Это фактически приводит к операции вычитания и потере значащих цифр.

Если в примере «b» было отрицательным (скажем, -200), то формула приведет к операции сложения. Следовательно, мы сможем избежать потери значащих цифр.

-b + sqrt (b * b - 4ac) = - (- 200) + sqrt (-200 * -200 - 4 * 1 * - 0,000015)

Предлагаемые мной изменения для этого раздела: [ править ]

Лучший алгоритм

Лучший алгоритм решения квадратных уравнений основан на двух наблюдениях: одно решение всегда является точным, а другое - нет, и что при одном решении квадратичного уравнения другое легко найти.

Если

а также


то мы имеем тождество (одна из формул Вьете для многочлена второй степени)

.

Приведенные выше формулы (1) и (2) идеально подходят для квадратного уравнения, коэффициент b которого отрицателен (b <0). Если «b» отрицательно, то «-b» в формулах преобразуется в положительное значение, поскольку - (- b) равно «b». Следовательно, мы можем избежать вычитания и потери значащих цифр из-за этого. Но если коэффициент «b» положительный, нам нужно использовать другой набор формул. Второй набор формул, применимых для нахождения корней при положительном коэффициенте b, упомянут ниже.


а также


В приведенных выше формулах (3) и (4), когда «b» положительно, формула преобразует его в отрицательное значение, поскольку - (+ b) равно -b. Теперь, согласно формулам, '-b' вычитается на квадратный корень из (b * b - 4ac), так что в основном это операция сложения. В нашем примере коэффициент b квадратного уравнения положителен. Следовательно, нам нужно использовать второй набор формул, то есть формулы (3) и (4).


Алгоритм следующий. Используйте формулу корней квадратного уравнения, чтобы найти решение большей величины, которое не страдает от потери точности. Затем используйте этот идентификатор для вычисления другого корня. Поскольку вычитания не требуется, потери точности не происходит.

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

что верно.

Мне нравится здесь общая идея ... но она несколько запутанная. Вы можете легко получить формулу Вите x_1 * x_2 = c / a (просто умножьте выражение (x- x_1) (x-x_2) и приравняйте его к моническому многочлену x ^ 2 + b / ax + c / a) . Таким образом, вам не нужно записывать все приведенные выше формулы, если вы просто хотели использовать формулу Вите. - DudeOnTheStreet ( разговор ) 07:33, 4 мая 2011 г. (UTC)

Подробнее в разделе нестабильности [ править ]

Я думаю, что было бы полезно включить более подробную информацию в пример, обсуждающий нестабильность квадратной формулы. Во-первых, квадратная формула, безусловно, не всегда дает неточный корень, поэтому было бы полезно указать, почему эта формула не всегда может давать точный результат, вместо того, чтобы приводить только один пример. Это может быть простое изменение, например, просто утверждение о том, как, когда c очень мало, потеря значимости может произойти в любом из вычислений корня, в зависимости от знака b.. Кроме того, я думаю, что этот пример был бы более эффективным с дополнительными пояснениями. Я думаю, что важно показать, что такого особенного в этом конкретном полиноме, что приводит к потере значимости. Простое указание на «вычитание» как причину потери значимости может ввести некоторых читателей в заблуждение, поскольку точный корень был вычислен с использованием -b минус аналогичное число. —Предыдущий комментарий без подписи, добавленный Vv148408 ( обсуждениевклад ) 07:19, 24 сентября 2010 г. (UTC)

Сделанный. Но так ли уж лучше? Я сам не верю в «объяснение», но, возможно, другие сочтут его более проясняющим, чем я!
Я лично считаю, что эффект вызван любым расчетом, требующим более значащих цифр, чем у нас есть для вычислительной задачи; но у меня нет ссылки, чтобы поддержать меня. Мои впечатления сформировались в результате многих лет практических вычислений и необходимости разработки эффективных алгоритмов для вычислений с плавающей запятой произвольной точности на компьютерной архитектуре с фиксированной запятой. Но это оригинальные исследования, а потому не энциклопедические.
йойо ( разговор ) 06:05, 5 июля 2012 (UTC)

Изменение в примере [ править ]

Меня зовут Кайл Д., я учусь на бакалавриате в Университете Огайо, изучаю электротехнику. Я предлагаю изменить пример на странице.

Проблемы с примером:

1. Машина не хранит десятичные числа с плавающей запятой, за исключением вычислений с двоичными десятичными числами, что бывает редко.

Decimal работает для целей примера, но не отражает фактических вычислений.

Если мы использовали двоичное число:

 Всем было бы легче. (0.12345678901234567890 сложно посмотреть.) Читатель, знакомый с двоичным кодом, сможет лучше понять суть вычислений. Читатель, не знакомый с двоичным кодом, все равно поймет этот пример как десятичный.

2. 10 цифр - это много для размышлений. Это всего лишь пример.

Я думаю, что для целей этого примера должен работать 4-битный процессор FP.

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

Я думаю, что эти изменения сделают пример намного более понятным как для двоичных, так и для десятичных считывателей. Вот предлагаемый пример:


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

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

 1,001111111

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

 1.001,

что довольно близко - разница очень мала по сравнению с любым из двух чисел.

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

 1,001111111 - 1

Настоящий ответ с точностью до 7 значащих битов:

 0,001111111

Однако на 4-битной машине с плавающей запятой вычисление дает

 1,001–1,000 = 0,001

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

Это явление можно распространить на числа с плавающей запятой любого размера. Вместо 4 значащих битов стандартное число с плавающей запятой одинарной точности IEEE имеет 23 значащих бита и 1 бит знака.

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

Считайте действительное десятичное число

 0.1234567891234567890.

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

 0,1234567891,

что довольно близко - разница очень мала по сравнению с любым из двух чисел.

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

 0.1234567891234567890 - 0.1234567890.

Настоящий ответ с точностью до 10 цифр:

 0,0000000001234567890.

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

 0,1234567891 - 0,1234567890 = 0,0000000001.

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

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

Одна из наиболее важных частей численного анализа - избежать или минимизировать потерю значимости в расчетах. Если основная проблема поставлена ​​правильно, должен существовать стабильный алгоритм ее решения. Искусство состоит в том, чтобы найти стабильный алгоритм. —Предыдущий неподписанный комментарий, добавленный Kyle.drerup ( обсуждениевклад ) 14:56, 24 сентября 2010 г. (UTC)

Возможная ошибка [ править ]

«Если основная проблема поставлена ​​правильно, должен существовать стабильный алгоритм для ее решения. Искусство состоит в том, чтобы ее найти». Это почему? Это похоже на принятие желаемого за действительное, а не на математический факт. - Предыдущий беззнаковый комментарий добавлен 181.28.64.87 ( обсуждение ) 08:19, 12 декабря 2012 г. (UTC)

Многочлен крупа [ править ]

... должно быть добавлено, я полагаю? - Cognoscent ( разговор ) 12:34, 1 октября 2013 г. (UTC)