сложная математика Python 3 неправильный ответ - PullRequest
0 голосов
/ 08 марта 2019

Итак, я пытался получить e^(pi*I)=-1, но Python 3 дает мне другой, странный результат: print(cmath.exp(cmath.pi * cmath.sqrt(-1))) Результат:

(-1+1.2246467991473532e-16j)

В теории это должно возвращать -1, нет?

Ответы [ 2 ]

3 голосов
/ 08 марта 2019

(Частичный ответ на пересмотренный вопрос.)

Теоретически, результат должен быть -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.

0 голосов
/ 08 марта 2019

Нашел ответ.Во-первых, python 3 не может правильно вычислить иррациональные числа, и поэтому e ^ (pi * I) не вернет -1, как указано в Этот ответ Во-вторых, python 3 возвращает любое комплексное число в виде декартовой пары (реальное + воображаемое).

Исправлено было извлечь действительную часть числа: print(cmath.exp(cmath.pi * cmath.sqrt(-1)).real)

...