Why is pow(-infinity, positive non-integer) +infinity?

c, floating-point, ieee-754, math, standards

Solution

For odd integer `y`, it makes sense to define

pow(±0, y) = ±0

After all, raising to an odd power always preserves the sign. If we can preserve the sign of zero, we might as well do it. For positive non-integer `y`, we should define

pow(±0, y) = +0.

The sign is undefined. But we don't set this to `NaN` for `-0` for the same reason we don't set `sqrt(-0)` equal to `NaN`: it just wouldn't make sense. (FWIW, this is also how it is defined in section 9.2.1 of the IEEE-754-2008 standard.)

Since 1/±0 = ±∞, and mathematically

pow(x,y) = 1/pow(1/x,y)

then setting `x=±∞` in the above, leads to:

pow(±∞,y) = 1/pow(±0,y) = 1/+0 = +∞

for `y` a positive non-integer.

Problem

C99 annex F (IEEE floating point support) says this: `pow(−∞, y)` returns +∞ for y > 0 and not an odd integer. But, say, (−∞)0.5 actually has the imaginary values ±∞i, not +∞. C99’s own `sqrt(−∞)` returns a NaN and generates a domain error as expected. Why then is `pow` required to return +∞? (Most other languages use the C library directly or, like Python in this case, copy the behaviour required of it by standards, so in practice this affects more than just C99.)

Original source