Порядок операцій, числові алгоритми


10

Я це прочитав

(1) Погані кондиціоновані операції слід виконувати перед добре кондиціонованими.

Як приклад, слід обчислити як оскільки віднімання погано обумовлене, а множення не відбувається.xzyz(xy)z

Однак аналіз помилок першого порядку обох алгоритмів виявляє, що вони відрізняються лише коефіцієнтом три (*), і я не бачу, чому можна узагальнити це до твердження (1), і не інтуїтивно зрозуміти значення порядок операцій. Як ви вважаєте, висловлювання (1) є прийнятим правилом, і чи є у вас інші пояснення до нього?

*: точніше, перша версія має відносну помилку, обмежену

eps+3|x|+|y||x||y|eps
а відносна помилка другої версії обмежена

3eps+|x|+|y||x||y|eps

де - машинна точність.eps

Цей аналіз ґрунтується на припущенні, що -й проміжний результат помножується на (через помилки округлення), де є випадковими змінними, обмеженими . "Перший порядок" означає, що термінами вищого порядку, наприклад , нехтують.i(1+εi)εiepsϵiϵjx


Де ти це читав?
Девід Кетчесон

у моїх лекційних записках
Бананах

Відповіді:


8

Позначимо через (я ліниво намагався отримати кругову версію оператора ділення) аналоги з плаваючою комою точного множення ( ), додавання ( ) та віднімання ( ) відповідно. Будемо вважати (IEEE-754), що для всіх них де - це епсилон машини, що надає верхню межу відносної похибки через округлення. Ми також використаємо таку лему (якщо припустити, що всі , а не надто велика), яку можна легко довести: × + - [ x y ] = ( x + y ) ( 1 + δ ) ,,,×+ϵ m a c h | δ i | ϵ m a c h m m i = 1 ( 1 + δ i ) = 1 + θ ( m ) ,

[xy]=(x+y)(1+δ),|δ|ϵmach,
ϵmach|δi|ϵmachm
i=1m(1+δi)=1+θ(m),|θ(m)|mϵmach1mϵmach

Давайте визначимо справжню функцію яка діє на дійсні числа якfx,y,z

f(x,y,z)=(x×z)(y×z)

і дві версії реалізації функції в арифметиці з плаваючою комою, сумісною з IEEE, як і які працюють на представленнях з плаваючою комою таким чином:f1~f2~x~=x(1+δx),y~,z~

f1~(x~,y~,z~)=(x~z~)(y~z~),

f2~(x~,y~,z~)=(x~y~)z~.

Аналіз помилок для :f1~

f1~=((x(1+δx)×z(1+δz))(1+δxz)(x~z~)(y(1+δy)×z(1+δz))(1+δyz)(y~z~))(1+δ)=xz(1+δx)(1+δz)(1+δxz)(1+δ)yz(1+δy)(1+δz)(1+δyz)(1+δ)=xz(1+θxz,1)yz(1+θyz,1).
Тут, .|θxz,1|,|θyz,1|4ϵmach14ϵmach

Аналогічно для Тут, .f2~

f2~=(((x(1+δx)y(1+δy)(1+δxy))×(z(1+δz)))(1+δ)=xz(1+δx)(1+δz)(1+δxy)(1+δ)yz(1+δy)(1+δz)(1+δxy)(1+δ)=xz(1+θx,2)yz(1+θy,2).
|θx,2|,|θy,2|4ϵmach14ϵmach

Отже, і для і для ми отримали вирази одного типу, тому я не бачу, чому одна реалізація була б кращою для іншої з числової точки зору (крім того, що виконує лише 2 операції з плаваючою комою порівняно з ).f1~f2~f2~f1~

Обчислення відносної помилки покаже, що проблема виникає з того, що і можуть бути дуже близькими ( скасування ).xy

|f1~f||f|=|xz+xzθxz,1yzyzθyz,1(xzyz)||xzyz|=|xθxz,1yθyz,1||xy||x|+|y||xy|4ϵmach14ϵmach,
|f2~f||f|=|xz+xzθx,2yzyzθy,2(xzyz)||xzyz|=|xθx,2yθy,2||xy||x|+|y||xy|4ϵmach14ϵmach.

Невеликі відмінності між 's можуть зробити одну з двох числових реалізацій незначно кращою або гіршою залежно від . Однак я сумніваюся, що це може мати будь-яке значення. Результат абсолютно має сенс, тому що незалежно від того, якщо вам доведеться обчислити , коли і досить близькі за значеннями (для точності, з якою ви працюєте) за допомогою арифметики з плаваючою комою, ніяке масштабування не допоможе вам: ви вже в біді.x , y , z ( x - y ) x yθx,y,z(xy)xy

Примітка: Усі обговорення вище не передбачають переповнення або переливу, тобто , є множиною всіх нормальних чисел з плаваючою комою.F 0x,y,z,f(x,y,z)F0F0

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.