Неверный ответ при возведении переменной в степень 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 шт):

Автор решения: Stanislav Volodarskiy

-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 or float and a non-integral exponent, a complex result is delivered.

Если нужно извлекать кубические корни без этих сложностей используйте math.cbrt:

@>>> import math
@>>> math.cbrt(-1)
-1.0
→ Ссылка