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

spe*_*rgw 5 r transformation nan

我在编码中遇到了一个非常奇怪的问题R。以下是我拥有的一些值的示例以及将这些值设为 1/10 时的结果。请注意每个值如何变为 NaN。

vals <- c(-0.02964166, -0.01018776, -0.01758487)
vals^(1/10)

[1] NaN NaN NaN
Run Code Online (Sandbox Code Playgroud)

但如果我将数字单独取到 1/10,我不会得到NaNs,而是得到值。

-0.02964166^(1/10)

[1] -0.7033804

-0.01018776^(1/10)

[1] -0.6321321

-0.01758487^(1/10)

[1] -0.6675963

Run Code Online (Sandbox Code Playgroud)

这里发生了什么以及如何对向量执行此操作以免丢失数字?

Ben*_*ker 4

这是R FAQ 7.33的变体,与一元减运算符的优先级有关:-0.1^0.1(例如)被解析为 -(0.1^0.1)。当您将表达式放入向量中时,会先于-进行求值。^

sign(vals)*(abs(vals))^(1/10)
Run Code Online (Sandbox Code Playgroud)

由于非常迂腐,您可以通过以下方式获得复杂的根源之一

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

或者所有的根都这样

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
Run Code Online (Sandbox Code Playgroud)

(这找到了方程的根1*x^10 + 0*x^9 + ... + 0*x - val == 0,即x^10 - val = 0

从技术上讲,我认为(除非我弄错了)您正在寻找的实际根是第五个(0.0000000+0.7033804i);i这是相对于答案的一个因素sign(x)*(abs(x)^(1/10))......我们可以确认答案应该是纯虚的,即

all.equal((0.7033804i)^10, as.complex(vals[1]), tol = 1e-6)
Run Code Online (Sandbox Code Playgroud)

是真的。