复数根在第二个多项式中

时间:2013-03-15 19:11:39

标签: r

我正在处理seconf阶多项式的根,我只是想存储复数根(只有虚部的那些)。当我这样做时:

Im(roots)) 
[1] -1.009742e-28  1.009742e-28

所以程序说不等于0.所以条件

Im(roots) ==0

永远不会是真的。而且我正在存储所有真正的根源。 谢谢!

2 个答案:

答案 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