Python 3 сложная математика неправильный ответ

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

(-1+1.2246467991473532e-16j)

Теоретически это должно возвращать -1, нет?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
520
2

Ответы 2

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

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

О, извините, да, это действительно был результат, который я получил (попробовал с математикой просто для проверки). Моя ошибка заключалась в копировании результата. Проблема в том, что он должен быть ровно -1.

Lhakryma DL 08.03.2019 00:26

Спасибо за расширенный ответ, я попробую sympy

Lhakryma DL 08.03.2019 01:40

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

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

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

Rory Daulton 08.03.2019 00:50

Другие вопросы по теме