Неверный ответ при возведении переменной в степень 1/3 python
При выполнении кода
f=-1**(1/3)
Переменная f принимает значение -1 как и должно быть. Но в случае выполнения кода:
x=-1
f=x**(1/3)
Переменная f принимает значение (0.5000000000000001+0.8660254037844386j)
Подобное происходит и при других отрицательных значениях x
Например:
- При x=-8
(1.0000000000000002+1.7320508075688772j) - При x=-27
(1.5000000000000004+2.598076211353316j)
Почему это происходит, и как это решать?
Ответы (1 шт):
-1**(1/3)
Выражение -1**(1/3)
разбирается компилятором как -(1**(1/3))
(6.5. The power operator):
Thus, in an unparenthesized sequence of power and unary operators, the operators are evaluated from right to left (this does not constrain the evaluation order for the operands):
-1**2
results in-1
.
Возведение в степень возвращает единицу, унарный минус превращает её в минус единицу.
x**(1/3)
Возведение в степень равносильно вызову pow
(6.5. The power operator):
The power operator has the same semantics as the built-in
pow()
function, when called with two arguments: it yields its left argument raised to the power of its right argument.
В случае x=-1; f=x**(1/3)
получается вызов pow(-1, 1 / 3)
. А так как вы возводите отрицательное число в вещественную (не целую) степень, то вычисляется комплексный корень (pow(base, exp, mod=None)
):
For a negative base of type
int
orfloat
and a non-integral exponent, a complex result is delivered.
Если нужно извлекать кубические корни без этих сложностей используйте math.cbrt
:
@>>> import math @>>> math.cbrt(-1) -1.0