Why do the two inputs give different values?

in:=(-y)^a /. a -> 2.99 /. y -> -2


in:=(-1)^a (y)^a /. a -> 2.99 /. y -> -2
out:=7.92906 - 0.498854 I

They are supposed to be different.

(-y)^a /. a -> 2.99 /. y -> -2

is equivalent to



Exp[2.99 Log[2]]

all giving the same answer whereas

(-1)^a (y)^a /. a -> 2.99 /. y -> -2
(*7.92906 -0.498854 I*)


(*-0.999507 + 0.0314108 I*)


(*-7.94082+0.24955 I*)

(*7.92906 -0.498854 I*)

or another way

Exp[2.99 Log[-2]] Exp[2.99 Log[-1]]
(*7.92906 -0.498854 I*)

Powers and roots of complex numbers really do matter how and in what order they are calculated.


Complex power is really a multivalued function. Consider this function, that returns all possible values of a complex number $x^y$:

complexPowers[x_, y_?NumericQ] := With[{r = Rationalize[y]},
  SortBy[ResourceFunction["ComplexRoots"][x, Denominator[r]]^Numerator[r], Arg]]

Also an auxiliary function to multiply them in all possible ways:

multiplyPowers[xs_ /; VectorQ[xs, NumericQ], ys_ /; VectorQ[ys, NumericQ]] := 
 SortBy[DeleteDuplicates@Flatten@Outer[Times, xs, ys], Arg]

Then your example reduces to comparing all values of complexPowers[-y, a] and multiplyPowers[complexPowers[-1, a], complexPowers[y, a]]

complexPowers[-y, a] == multiplyPowers[complexPowers[-1, a], complexPowers[y, a]] /. {y -> -2, a -> 2.99}
(* True *)

If you want to write things in terms of symbols without minus signs flying around, you can use PowerExpand. If used naively, it treats all symbols as positive real numbers which is not always the case, and certainly is incorrect in OP's situation.

The trick is to set all assumptions to true, hence disabling all simplifications that are correct only for positive real numbers. Indeed, we have


$$(-1)^a y^a$$


PowerExpand[(-y)^a, Assumptions -> True]

$$y^a e^{2 i \pi a \left\lfloor -\frac{\arg (y)}{2 \pi }\right\rfloor +i \pi a}$$

If you now set $\{a,y\}$ to any particular numbers you like, you get the correct result:

N[(E^(I a π+2 I a π Floor[-(Arg[y]/(2 π))]) y^a)/.y->-2/.a->299/100]

7.94474 +0. I

Similar to all numeric computations, one needs to be careful with potential finite precision errors. Indeed, we see that

(E^(I a π + 2 I a π Floor[-(Arg[y]/(2 π))]) y^a) /. y -> -2 /. a -> 2.99

7.94474 - 2.77556*10^-17 I

which can be avoided as we did in the first case (using 299/100 instead of 2.99 and hitting with N at the end) or we can try increased precision:

(E^(I a π + 2 I a π Floor[-(Arg[y]/(2 π))]) y^a) /.  y -> -2 /. a -> 2.99`10

7.94473996 + 0.*10^-8 I


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.