在某些情况下,转换后的值返回NaN,但在其他情况下返回数字。

5
我在我的R编程中遇到了一个非常奇怪的问题。这里是一些数值的样本,如果我将这些数值除以10,结果会变成NaN。
vals <- c(-0.02964166, -0.01018776, -0.01758487)
vals^(1/10)

[1] NaN NaN NaN

但是如果我把数字分别除以10,我得到的不是NaN,而是数值。

-0.02964166^(1/10)

[1] -0.7033804

-0.01018776^(1/10)

[1] -0.6321321

-0.01758487^(1/10)

[1] -0.6675963


这里发生了什么情况,我应该如何对向量执行此操作,以免丢失数字?
1个回答

4
这是 R FAQ 7.33 的一个变种,与 负一元 运算符的优先级有关:-0.1^0.1(例如)被解析为-(0.1^0.1)。当将表达式放入向量中时,-^ 之前进行求值。
sign(vals)*(abs(vals))^(1/10)

很吹毛求疵地说,你可以通过以下方式得到一个复数根:

这样:

as.complex(vals)^(1/10)
[1] 0.6689545+0.2173565i 0.6011934+0.1953396i 0.6349218+0.2062986i

或者以这种方式找到所有的根

polyroot(c(-vals[1], rep(0,9), 1))
 [1]  0.4134366+0.5690467i -0.4134366+0.5690467i -0.4134366-0.5690467i
 [4]  0.6689545-0.2173565i  0.0000000+0.7033804i -0.6689545+0.2173565i
 [7]  0.0000000-0.7033804i  0.6689545+0.2173565i -0.6689545-0.2173565i
[10]  0.4134366-0.5690467i

(这个函数找到方程 1*x^10 + 0*x^9 + ... + 0*x - val == 0 的根,即 x^10 - val = 0
从技术上讲,我认为(除非我弄错了什么),你要寻找的实际根是第五个(0.0000000+0.7033804i);相对于 sign(x)*(abs(x)^(1/10)) 的答案,这个根多了一个 i 的因子...我们可以确认答案应该是纯虚数,也就是说,
all.equal((0.7033804i)^10, as.complex(vals[1]), tol = 1e-6)

是真的。

你也可以将计算重写为:x^{\frac{1}{10}} = \sqrt[10]{x^1};正如Ben所说,减号在^之前被计算,因此R试图计算负数的平方根,而负数没有实数平方根,因此结果为NaN - Julian
你还可以将计算重写为:x^{\frac{1}{10}} = \sqrt[10]{x^1};正如Ben所说,减号在^之前被计算,因此R试图计算负数的平方根,而负数没有实数平方根,因此结果为NaN - Julian
你还可以将计算重写为:x^{\frac{1}{10}} = \sqrt[10]{x^1};正如Ben所说,减号在^之前被计算,因此R试图计算负数的平方根,而负数没有实数平方根,因此结果为NaN - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接