Итак, я пытался получить e^(pi*I)=-1
, но Python 3 выдал мне другой странный результат:
print(cmath.exp(cmath.pi * cmath.sqrt(-1)))
Результат:
(-1+1.2246467991473532e-16j)
Теоретически это должно возвращать -1, нет?
(Частичный ответ на пересмотренный вопрос.)
В теории результат должен быть -1
, но на практике теория немного неверна.
Модуль cmath
использует переменные с плавающей запятой для выполнения своих вычислений — одно значение с плавающей запятой для действительной части комплексного числа и другое значение с плавающей запятой для мнимой части. Поэтому устройство сталкивается с ограничениями математики с плавающей запятой. Подробнее об этих ограничениях см. в каноническом вопросе Математика с плавающей запятой сломана?.
Короче говоря, значения с плавающей запятой обычно являются простым приближением к реальным значениям. Значение cmath.pi
на самом деле не равно пи, это просто наилучшее приближение, которое подходит для единиц с плавающей запятой многих компьютеров. Так что вы на самом деле не вычисляете e^(pi*I)
, а только приблизительно. Возвращаемое значение имеет точную, правильную действительную часть, -1
, что меня несколько удивляет. Мнимая часть «должна быть» равна нулю, но фактический результат соответствует от нуля до 15 знаков после запятой или более 15 значащих цифр по сравнению с начальным значением. Это обычная точность для плавающей запятой.
Если вам нужны точные ответы, вам не следует работать со значениями с плавающей запятой. Возможно, вам стоит попробовать алгебраическое решение, такое как модуль sympy
.
(Ниже был мой первоначальный ответ, который относился к предыдущей версии вопроса, где результатом было сообщение об ошибке.)
Сообщение об ошибке показывает, что вы набрали не то, что, как вы думали, набрали. Вместо cmath.exp
снаружи выражения вы набрали math.exp
. math
версия экспоненциальной функции ожидает значение с плавающей запятой. Вы дали ему сложное значение (cmath.pi * cmath.sqrt(-1)
), поэтому Python подумал, что вы хотите преобразовать это сложное значение в число с плавающей запятой.
Когда я набираю выражение, которое вы даете в верхней части вашего вопроса, с правильно введенным cmath
, я получаю результат
(-1+1.2246467991473532e-16j)
что очень близко к желаемому значению -1
.
Спасибо за расширенный ответ, я попробую sympy
Нашел ответ. Во-первых, Python 3 не может правильно вычислять иррациональные числа, поэтому e^(pi*I) не вернет -1, согласно Этот ответ. Во-вторых, Python 3 возвращает любое комплексное число в виде декартовой пары (действительное + мнимое).
Исправление заключалось в том, чтобы извлечь реальную часть числа:
print(cmath.exp(cmath.pi * cmath.sqrt(-1)).real)
Как я писал в своем исправленном ответе, это своего рода совпадение, что результат имеет точно правильную действительную часть. Не стоит рассчитывать на это для других, подобных расчетов.
О, извините, да, это действительно был результат, который я получил (попробовал с математикой просто для проверки). Моя ошибка заключалась в копировании результата. Проблема в том, что он должен быть ровно -1.