Сегодня я начал изучать GNU Octave и попробовал первое выражение, приведенное в руководстве.
exp(i*pi)
Результатом является
ans = -1.0000e+000 + 1.2246e-016i
И, похоже, GNU Scientific Library тоже даёт похожие результаты.
Так это ошибка Octave или общие проблемы программного обеспечения для численного анализа (программное обеспечение для символьной оценки определенно даст ответ «точно один»)?
решение1
Это не ошибка ни того, ни другого, но из-за способа, которым компьютеры выполняют операции с плавающей точкой. Существует ограниченная точность, с которой может работать любой компьютер, и поэтому иногда вы будете видеть аномалии, подобные этой. Хотя можно написать программное обеспечение, которое может справиться с этим, это займет гораздо больше времени вычислений и радикально увеличит требования к памяти.
Если вы посмотрите на это, e^(i*pi) возвращает -1 + 1.2x10^-16i. Как вы можете видеть, мнимая составляющая чрезвычайно мала (большинство посчитало бы ее пренебрежимо малой, так как она на 16 порядков меньше действительной части). Эта составляющая вводится округлением и ошибками точности, как с самим вычислением, так и с сохраненным значением числа pi, поскольку оно иррационально (см.эта ссылкадля другого примера, связанного с иррациональными числами).
Если эта ошибка в расчетах неприемлема, вам следует рассмотреть математические пакеты, которые выполняют символьный, а не численный анализ, или те, которые используютчисла с плавающей точкой высокой точности. Предостережения в том, что они резко увеличат ваши требования к памяти, а символьный анализ часто намного медленнее. Кроме того, более высокие точные числа просто уменьшат величину ошибок округления/точности,нетустраните их.