Чому вираз exp (i * pi) повертає неправильний результат у GNU Octave?


8

Я почав вивчати GNU Octave сьогодні і спробував перший вираз, наведений у посібнику

exp(i*pi)

Результат -

ans = -1.0000e+000 + 1.2246e-016i

Схоже, і наукова бібліотека GNU дає подібні результати.

Так це помилка Octave або загальні проблеми програмного забезпечення для чисельного аналізу (символічне програмне забезпечення обов'язково дасть точну відповідь)?


2
Здається, октава є первинною, призначеною для чисельного аналізу. Mathematica напевно дасть вам кращу відповідь ...: P просто жартую ... Спробуйте пошукати рішення символічного аналізу GNU
gd1

@Giacomo: Я це знаю. Мені просто цікаво, чи оцінюється все числове аналітичне програмне забезпечення до такої кількості, чи просто GNU Octave.
Сіюань Рен

@Karsus Ren це насправді не програмна помилка, а апаратна. Це властиве обмеження спроби оцінювати вирази з нераціональними числами на апаратному забезпеченні з обмеженою кількістю пам’яті для одного номера.
Прорив

Відповіді:


8

Це не помилка ні з одним, але через те, як комп'ютери виконують операції з плаваючою точкою. З якою комп’ютером може працювати точність, обмежена точність, і іноді ви побачите подібні аномалії. Хоча можна писати програмне забезпечення, яке може впоратися з цим, це займе набагато більше часу на обчислення та суттєво збільшить потреби в пам'яті.

Якщо ви подивитесь на це, то e ^ (i * pi) повертає -1 + 1.2x10 ^ -16i. Як бачите, уявна складова надзвичайно мала (більшість вважає це мізерно малою, оскільки це на 16 порядків менше, ніж реальна частина). Цей компонент вводиться помилками округлення та точності, як із самим обчисленням, так і із збереженим значенням pi, оскільки це нераціонально (див. Це посилання для іншого прикладу, що стосується ірраціональних чисел).

Якщо ця помилка обчислення неприйнятна, слід заглянути в математичні пакети, які виконують символічний, а не числовий аналіз, або ті, що використовують високоточні числа з плаваючою комою . Ці застереження в тому, що вони різко збільшать ваші потреби в пам'яті, а символічний аналіз часто набагато повільніше. Також більш високі показники точності просто зменшать величину помилок округлення / точності, а не усунуть їх.


1
Мені просто потрібно підтвердження, що це звичайна поведінка програмного забезпечення для чисельного аналізу.
Сіюань Рен

@Karsus Ren це фактично поведінка такого програмного забезпечення з досить високою точністю . Я знаю, що здається контрінтуїтивним, але більш низькі показники точності не повертають цих аномалій так часто. Докладнішу інформацію див. У цій статті від Microsoft , але пам’ятайте, що ця проблема є поєднанням вихідного коду та архітектури компілятора / цілі. Також ця стаття у Вікіпедії містить хорошу довідкову інформацію щодо проблеми.
Прорив

1
Основна проблема полягає в тому, що константа Октава - piце не математична константа π, а близьке наближення до плаваючої точки до неї. expФункція додає ще одну невелику помилку , що. Система, яка працює з символічними виразами, могла б exp(i*pi)точно обчислити ; Октава - це не така система.
Кіт Томпсон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.