15.8.2.13 Math.pow(x,y)

2010-07-12

number Math.pow(x,y)

Return x raised to the power of y.

Note: a negative x and non-integer y (combined) results in NaN, except when special edge cases are met. This is (probably) because the sign could not be determined for fractional multiplications.

The edge cases relate to x or y being infinite or NaN.

Code: (Meta Ecma)
Math.pow = function(x,y){
x = ToNumber(x);
y = ToNumber(y);
if (isNaN(y)) return NaN;
if (y === +0) return 1;
if (y === -0) return 1;
if (isNaN(x)) return NaN;
if (Math.abs(x) > 1 && y == +Infinity) return +Infinity;
if (Math.abs(x) > 1 && y == -Infinity) return +0;
if (Math.abs(x) == 1 && y == +Infinity) return NaN;
if (Math.abs(x) == 1 && y == -Infinity) return NaN;
if (Math.abs(x) < 1 && y == +Infinity) return +0;
if (Math.abs(x) < 1 && y == -Infinity) return +Infinity;
if (x == +Infinity && y > 0) return +Infinity;
if (x == +Infinity && y < 0) return +0;
if (x == -Infinity && y > 0 && Math.floor(x) == x && x % 2 == 0) return -Infinity; // odd integer
if (x == -Infinity && y > 0 && Math.floor(x) == x) return +Infinity; // even integer
if (x == -Infinity && y < 0 && Math.floor(x) == x && x % 2 == 0) return -0; // odd integer
if (x == -Infinity && y < 0 && Math.floor(x) == x) return +0; // even integer
if (x === +0 && y > 0) return +0;
if (x === +0 && y < 0) return +Infinity;
if (x === -0 && y > 0 && Math.floor(x) == x && x % 2 == 0) return -0;
if (x === -0 && y > 0 && Math.floor(x) == x && x) return +0;
if (x === -0 && y < 0 && Math.floor(x) == x && x % 2 == 0) return -Infinity;
if (x === -0 && y < 0 && Math.floor(x) == x && x) return +Infinity;
if (x < 0 && Math.floor(y) != y) return NaN;
return Math.pow(x,y);
}