我正在处理 seconf 阶多项式的根,我只需要存储复数根(只有虚部的根)。当我做:
Im(roots))
[1] -1.009742e-28 1.009742e-28
所以程序说不等于0。所以条件
Im(roots) ==0
从来都不是真的。我也存储了所有真实的根。谢谢!
我正在处理 seconf 阶多项式的根,我只需要存储复数根(只有虚部的根)。当我做:
Im(roots))
[1] -1.009742e-28 1.009742e-28
所以程序说不等于0。所以条件
Im(roots) ==0
从来都不是真的。我也存储了所有真实的根。谢谢!
这可能是 FAQ 7.31 的一个案例(处理浮点数的表示和比较)。该all.equal
功能在这种情况下可用。最好的用途是
> isTRUE(all.equal(roots[1], 0) )
[1] TRUE
> isTRUE(all.equal(roots[2], 0) )
[1] TRUE
阅读?all.equal
所有血腥细节。
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