Почему выражение exp (i * pi) возвращает неправильный результат в GNU Octave?


8

Я начал изучать GNU Octave сегодня и попробовал первое выражение, данное в руководстве.

exp(i*pi)

Результат

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

И, похоже, Научная библиотека GNU тоже дает похожие результаты.

Так это ошибка Октавы или общие проблемы программного обеспечения для числового анализа (программное обеспечение для символической оценки определенно даст точный ответ)?


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

@ Джакомо: я знаю это. Мне просто интересно, оценивает ли все числовое аналитическое программное обеспечение такое число, или только 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.