0

我正在处理 seconf 阶多项式的根,我只需要存储复数根(只有虚部的根)。当我做:

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

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

Im(roots) ==0

从来都不是真的。我也存储了所有真实的根。谢谢!

4

2 回答 2

3

这可能是 FAQ 7.31 的一个案例(处理浮点数的表示和比较)。该all.equal功能在这种情况下可用。最好的用途是

> isTRUE(all.equal(roots[1], 0) )
[1] TRUE
> isTRUE(all.equal(roots[2], 0) )
[1] TRUE

阅读?all.equal所有血腥细节。

于 2013-03-15T19:24:02.313 回答
2

DWin 几乎可以肯定是正确的,由于浮点运算的不精确性,您得到的数字很小。

要在您的应用程序中更正它,您可能需要使用zapsmall(x, digits). zapsmall() 是一个很好的实用函数,可以将非常接近(在digits小数点内)的数字舍入为 0。

在这里,从其帮助页面中复制一个示例:

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
于 2013-03-15T19:35:41.713 回答