私は 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
決して真実ではありません。そして、本物だけのルーツもすべて保管しています。ありがとう!
This is probably a case of FAQ 7.31 (dealing with representation and comparison of floating point numbers). The all.equal
function is available in such cases. Best use would be
> isTRUE(all.equal(roots[1], 0) )
[1] TRUE
> isTRUE(all.equal(roots[2], 0) )
[1] TRUE
Read ?all.equal
for all the gory details.
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