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)
这里发生了什么以及如何对向量执行此操作以免丢失数字?
这是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)
是真的。
| 归档时间: |
|
| 查看次数: |
45 次 |
| 最近记录: |