将数字提升为非整数幂时奇怪的NaN

时间:2015-09-29 14:58:50

标签: r nan

我执行了以下代码:

tau <- 0.25
h <- 0.6 * n ^ (-1 / 5) * (4.5 * dnorm(qnorm(tau)) ^ 4 * qnorm(tau) / 
 (2 * (qnorm(tau) ^ 2 + 1)) ^ 2) ^ (1/5),

和R不断产生NaN。但是,R实际上会将(4.5 * dnorm(qnorm(tau)) ^ 4 * qnorm(tau) / (2 * (qnorm(tau) ^ 2 + 1)) ^ 2)计算为等于-0.003655336

奇怪的是我做了以下的事情

k <- -0.003655336
k ^ (1 / 3)
再次制作了

NaN

3 个答案:

答案 0 :(得分:2)

您正在计算负数的立方根。虽然正如@ mra68所指出的那样,存在一个真实的解决方案,但是负数的非整数指数的一般情况会导致复数。由于默认情况下R假设您正在处理实数,因此它会生成NaN

试试这个:

k <- -0.003655336
k <- as.complex(k)
k ^ (1 / 3)
#[1] 0.0770216+0.1334053i

结果并不是唯一的,因为有三个复数x满足条件x^3=k(包括虚部为零的情况),但NaN输出与非整数的一般情况一致,作为负实数的指数。可能有人认为,理性指数和非理性指数之间的区别可能是有用的,但在浮点计算中,这几乎是不可能的。我会考虑在负数的非整数指数的情况下NaN的出现是一个有用的警告标志。

答案 1 :(得分:1)

负数的第5个根仍然是可能的。我的袖珍计算器也做到了。由于(-1)^ 5 = -1,你可以这样做:

> tau <- 0.25

> a <- (4.5 * dnorm(qnorm(tau)) ^ 4 * qnorm(tau) / (2 * (qnorm(tau) ^ 2 + 1)) ^ 2)

> sign(a)*abs(a)^ (1/5)
[1] -0.3255258
> 

答案 2 :(得分:0)

请修改您的问题。 你给了自己答案。是基础数学。您不能将负数的幂赋予十进制数的幂。这是不确定的。