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

633
Siyuan Ren

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

exp(i*pi) 

Результат

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

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

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

8
Кажется, октава изначально предназначена для численного анализа. Mathematica определенно даст вам лучший ответ ...: P просто шучу ... Попробуйте найти решение для символического анализа GNU gd1 13 лет назад 2
@ Джакомо: я знаю это. Мне просто интересно, если все числовое аналитическое программное обеспечение оценивает такое число, или только GNU Octave. Siyuan Ren 13 лет назад 0
@Karsus Ren this isn't actually a software bug, but a hardware one. It's an inherent limitation of trying to evaluate expressions with irrational numbers on hardware with a limited amount of storage for a single number. Breakthrough 13 лет назад 0
http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html James 13 лет назад 0

1 ответ на вопрос

8
Breakthrough

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

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

Если эта ошибка вычисления неприемлема, вам следует изучить математические пакеты, которые выполняют символический, а не числовой анализ, или пакеты, в которых используются высокоточные числа с плавающей запятой . Предостережения от них заключаются в том, что они резко увеличат ваши требования к памяти, а символьный анализ часто выполняется намного медленнее. Кроме того, числа с более высокой точностью просто уменьшат величину ошибок округления / точности, а не устранят их.

Мне просто нужно подтверждение, что это обычное поведение программного обеспечения для численного анализа. Siyuan Ren 13 лет назад 1
@Karsus Ren it's actually behaviour of this kind of software with *high enough precision*. I know that seems counter-intuitive, but lower precision numbers don't return these anomalies as often. See [this article from Microsoft](http://support.microsoft.com/kb/125056) for more details, but remember, this issue is a combination of both the source code and the compiler/target architecture. Also, [this Wikipedia article](http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems) has some good background information on the problem. Breakthrough 13 лет назад 0
Основная проблема заключается в том, что постоянная Октавы «pi» - это не математическая константа «π», а близкое к ней приближение с плавающей точкой. Функция `exp` добавляет к этому еще одну небольшую ошибку. Система, которая работает с * символическими * выражениями, может точно вычислять `exp (i * pi)`; Октава не такая система. Keith Thompson 12 лет назад 1

Похожие вопросы