我正在处理seconf阶多项式的根,我只是想存储复数根(只有虚部的那些)。当我这样做时:
Im(roots))
[1] -1.009742e-28 1.009742e-28
所以程序说不等于0.所以条件
Im(roots) ==0
永远不会是真的。而且我正在存储所有真正的根源。 谢谢!
答案 0 :(得分:3)
这可能是FAQ 7.31(处理浮点数的表示和比较)的情况。在这种情况下,all.equal
功能可用。最好用的是
> isTRUE(all.equal(roots[1], 0) )
[1] TRUE
> isTRUE(all.equal(roots[2], 0) )
[1] TRUE
阅读?all.equal
了解所有血腥细节。
答案 1 :(得分:2)
DWin几乎肯定是正确的,因为浮点运算的不精确,你得到的数字幅度很小。
要在您的应用程序中更正它,您可能需要使用zapsmall(x, digits)
。 zapsmall()
是一个很好的实用函数,它将舍入到0个非常接近(在digits
小数位内)的数字。
在这里,从其帮助页面中搜索一个示例:
thetas <- 0:4*pi/2
coords <- exp(1i*thetas)
coords
# [1] 1+0i 0+1i -1+0i 0-1i 1-0i
## Floating point errors obscure the big picture
Im(coords) == 0
# [1] TRUE FALSE FALSE FALSE FALSE
Re(coords) == 0
# [1] FALSE FALSE FALSE FALSE FALSE
## zapsmall makes it all better
Im(zapsmall(coords)) == 0
# [1] TRUE FALSE TRUE FALSE TRUE
Re(zapsmall(coords)) == 0
# [1] FALSE TRUE FALSE TRUE FALSE