0

私は seconf 次数多項式の根を扱っていますが、複雑な根 (虚部のみを持つもの) のみを格納したいと考えています。私がする時:

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

したがって、プログラムはそれが 0 に等しくないと言います。したがって、条件は

Im(roots) ==0

決して真実ではありません。そして、本物だけのルーツもすべて保管しています。ありがとう!

4

2 に答える 2

3

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.

于 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 に答える