Оператор экспоненты Python и комплексные числа

Почему python print(type(-1**0.5)) возвращает float вместо complex?

Получение квадратного корня из отрицательного целого числа с плавающей запятой всегда математически рассматривается как комплексное число. Как оператор экспоненты python поддерживает получение числа complex?

print(type(-1**0.5))
 <type 'float'>    

person Ravindu De Silva    schedule 09.12.2016    source источник


Ответы (4)


В математическом порядке операций возведение в степень предшествует умножению, а унарный минус считается умножением (на -1). Итак, ваше выражение такое же, как -(1**0.5), в котором нет мнимых чисел.

Если вы сделаете (-1)**0.5, вы получите ошибку в Python 2, потому что ответ не является реальным числом. Если вам нужен сложный ответ, вам нужно использовать сложный ввод, выполнив (-1+0j)**0.5. (В Python 3 (-1)**0.5 вернет сложный результат.)

person BrenBarn    schedule 09.12.2016

Вместо этого попробуйте (-1)**0.5.

-1**0.5 равно 1.

>>> -1**0.5
-1
>>> (-1)**0.5
(6.123e-17+1j)
person Right leg    schedule 09.12.2016

Сначала производится возведение в степень, а затем инвертируется его знак. Чтобы получить желаемый результат, используйте круглые скобки, чтобы знак - оставался с 1:

>>> -1**0.5
-1.0
>>> (-1)**0.5
(6.123233995736766e-17+1j)
person TigerhawkT3    schedule 09.12.2016
comment
он должен вернуть (0+1j), откуда взялся 6.123233995736766e-17? - person Preetkaran Singh; 19.07.2020
comment
@PreetkaranSingh - математика с плавающей запятой стандарта IEEE неточна. Обратите внимание, что 6e-17 очень близко к нулю. - person TigerhawkT3; 23.07.2020

Python правильный, так как -1**0.5 отличается от (-1)**0.5.

Первый возводит единицу в степень 0.5 и отрицает результат.

Второй возводит -1 в ту же степень и возвращает комплексное число, как и ожидалось.

person ForceBru    schedule 09.12.2016