Если вы посмотрите на документации для CMATH и математики соответственно, вы увидите, что:
- cmath «обеспечивает доступ к математическим функциям для комплексных чисел»
- math «функция не может быть использована с комплексными числами , используйте функции с тем же именем из модуля cmath, если вам нужна поддержка сложных чисел ».
- Оператор
(**)
maps с функцией pow
с важной разницей, что pow
преобразует свои аргументы в float.
Следовательно, вы можете увидеть разные результаты с тремя функциями для одних и тех же аргументов, как показано на рисунке here. Обратите внимание, что если выражение имеет реальное решение, не будет никакой разницы между значением, возвращаемым math.sqrt
, и действительной частью значения, возвращаемого cmath.sqrt
. Однако вы получите сообщение об ошибке math.sqrt
, если нет реального решения.
Редактировать: Как указывает @jermenkoo, будет разница в значении, возвращаемом (**)
между Python 2 и 3 из-за разницы в том, как работает оператор /
. Однако, если вы используете 0,5 вместо 1/2, это не должно вызывать проблем.
Все эти усилия, и вы скрываете интересные отличия позади ссылки? '3 ** (1/2) == 1',' math.sqrt (3) == 1.73205080757' и 'cmath.sqrt (3) == (1.73205080757 + 0j)'. – Teepeemm
Да, чтобы настроить игровую площадку для тестирования OP, если они хотят –
@Teepeemm: первая зависит от поведения оператора '/' - в вашем случае он выполняет целочисленное деление и вычисляет '3 ** 0 = 1'. , В Python 3 вычисляется правильный результат, '1.732 ...'. – jermenkoo