2011-09-12 12 views
0

私は4つのリストを含むリストを反復しています。私が得た出力は以下の通りですが、私はなぜこの精度を得ているのだろうかと疑問に思っています。たとえば、他の場合と同じように最初の1.00だけではないのですか?最後の値リストに奇妙な出力がある

[[1]] 
[1] 1.00 0.96 0.84 0.74 0.66 0.56 0.48 0.36 0.26 0.16 0.06 0.00 

[[2]] 
[1] 1.00 0.98 0.84 0.74 0.66 0.56 0.48 0.38 0.26 0.16 0.06 0.00 

[[3]] 
[1] 1.00 0.94 0.84 0.74 0.66 0.56 0.48 0.36 0.26 0.16 0.06 0.00 

[[4]] 
[1] 1.000000e+00 9.400000e-01 8.400000e-01 7.400000e-01 6.600000e-01 5.800000e-01 4.600000e-01 3.600000e-01 2.600000e-01 1.600000e-01 6.000000e-02 1.110223e-16 
+1

楽しみのためだけに、lapply '実行してみてください(はmyList、STR)'との結果が何であるかを教えを –

答えて

1

使用:

lapply(mylist, round, digits=2) 

このアプローチは、それが数字モードの値を返す利点を有している形式()の呼び出しだろうではないし、それができますまた、「長い」です桁の仕様で使用すると効果的な「ゼロ・フィルタ」のようになります。

lapply(list(c(1,2), c(1.000000e+00, 9.400000e-01, 6.000000e-02, 1.110223e-16)), round, 

digits=13) 
[[1]] 
[1] 1 2 

[[2]] 
[1] 1.00 0.94 0.06 0.00 
+0

私は欲しかったようにうまく働いています。どうも – Bob

0

Rがフォーマットを選択するために使用する正確なアルゴリズムについてはわかりません。 1つのフォーマットが各リストのすべての値に使用されていることは明らかです。最後のリストには、大きく異なる桁の値、すなわち1.000000e+001.110223e-16が含まれていることも明らかです。したがって、Rが科学的記法を用いて最後のリストを印刷することを選択することは妥当であると考える。

+0

実際には1.11e-16は実質的にゼロです。 –

+0

@Dirk:あなたが何を意味するのか明確ではありません。 1e-16がバイナリ丸め誤差であるかどうかに関わらず、現行のoptions()$ scipen limitを超える値がリストにあるため、Rは科学記法を「選択」しています。 –

2

前回の質問にフォローアップコメントとして投稿したときにコメントしたように、これは表示上の問題です。最後の数は実質的にゼロである:

R> identical(0, 1.1e-16) 
[1] FALSE 
R> all.equal(0, 1.1e-16) 
[1] TRUE 
R> 

そのバイナリ表現がゼロではありませんが、それはほとんどの状況で十分に近い何かに評価されます。だからあなたは、あなたのデータにフィルタをかけ、ゼロに近いゼロを置き換えることができます。あるいは、コードをデバッグして、ゼロでないことがどのように出るのかを見ることができます。

浮動小数点計算に関連するR FAQおよび一般的な参考資料も参照してください。あなたは浮動小数点数が第2小数の桁に丸めて表示したい場合は