2015-11-13 2 views
1

В чем разница между x**1/2, math.sqrt() и cmath.sqrt()?Разница между ** 1/2, math.sqrt и cmath.sqrt?

Почему cmath.sqrt() получить сложные корни квадратного права в одиночку? Должен ли я использовать это только для своих квадратных корней? Что они делают на заднем плане по-другому?

ответ

5

Если вы посмотрите на документации для CMATH и математики соответственно, вы увидите, что:

  1. cmath «обеспечивает доступ к математическим функциям для комплексных чисел»
  2. math «функция не может быть использована с комплексными числами , используйте функции с тем же именем из модуля cmath, если вам нужна поддержка сложных чисел ».
  3. Оператор (**)maps с функцией pow с важной разницей, что pow преобразует свои аргументы в float.

Следовательно, вы можете увидеть разные результаты с тремя функциями для одних и тех же аргументов, как показано на рисунке here. Обратите внимание, что если выражение имеет реальное решение, не будет никакой разницы между значением, возвращаемым math.sqrt, и действительной частью значения, возвращаемого cmath.sqrt. Однако вы получите сообщение об ошибке math.sqrt, если нет реального решения.

Редактировать: Как указывает @jermenkoo, будет разница в значении, возвращаемом (**) между Python 2 и 3 из-за разницы в том, как работает оператор /. Однако, если вы используете 0,5 вместо 1/2, это не должно вызывать проблем.

+0

Все эти усилия, и вы скрываете интересные отличия позади ссылки? '3 ** (1/2) == 1',' math.sqrt (3) == 1.73205080757' и 'cmath.sqrt (3) == (1.73205080757 + 0j)'. – Teepeemm

+0

Да, чтобы настроить игровую площадку для тестирования OP, если они хотят –

+1

@Teepeemm: первая зависит от поведения оператора '/' - в вашем случае он выполняет целочисленное деление и вычисляет '3 ** 0 = 1'. , В Python 3 вычисляется правильный результат, '1.732 ...'. – jermenkoo

0

** .5 и math.sqrt будут почти идентичными.

** 0,5 собирается направить вас POW из стандартной библиотеки C powhttps://hg.python.org/cpython/file/661195a92131/Objects/floatobject.c#l783 и Math.sqrt направит вас SQRT в стандартной библиотеке C sqrt, оба из которых должны иметь одинаковую производительность. Большее различие, вероятно, будет вызвана разницей между

from math import sqrt 
sqrt(x) 

против

import math 
math.sqrt(x) 

только из-за поиска в sqrt в математическом модуле.

cmath отличается и будет медленнее. Это для математики на комплексных числах, поэтому она возвращает комплексные числа. Обратите внимание, что разница между cmath и math отличается от таких пакетов, как cPickle и pickle.