web-dev-qa-db-ja.com

Rの印刷出力の小数桁数の制御

Rには、数字の表示を制御するオプションがあります。例えば:

options(digits=10)

rセッションの終了まで10桁で計算結果を提供することになっています。 Rのヘルプファイルでは、digitsパラメーターの定義は次のとおりです。

digit:数値を印刷するときに印刷する桁数を制御します。これは単なる提案です。有効な値は1 ... 22デフォルトで7

そのため、これは提案にすぎないと述べています。多かれ少なかれ、常に10桁を常に表示したい場合はどうなりますか?

2番目の質問は、22桁を超える数字を表示したい場合、つまり100桁のようなより正確な計算をしたい場合はどうなりますか?ベースRで可能ですか、それとも追加のパッケージ/機能が必要ですか?

編集: jmoyの提案のおかげで、sprintf("%.100f",pi)を試してみました。

[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"

小数点以下48桁です。これはRが処理できる最大制限ですか?

100

これが単なる提案である理由は、オプション値を無視する印刷関数を非常に簡単に書くことができるからです。組み込みの印刷および書式設定関数は、デフォルトとしてoptions値を使用します。

2番目の質問については、Rは有限精度の算術を使用しているため、回答は小数点以下15桁または16桁を超えると正確ではないため、一般に、それ以上は必要ありません。 gmp および rcdd パッケージは、(gmpライブラリへのインターフェースを介して)複数精度の演算を処理しますが、これは主にdoubleの小数点以下の桁数ではなく、大きな整数に関連しています。

Mathematica または Maple を使用すると、希望する小数点以下の桁数を指定できます。

編集:
小数点以下の桁数と有効数字の違いについて考えると便利かもしれません。 15番目の有効数字を超える差に依存する統計テストを実行している場合、分析はほぼ間違いなくジャンクです。

一方、Rが.Machine$double.xmin(通常2e-308)ほどの小さい数を処理できるので、非常に小さい数を処理しているだけであれば、それは問題ではありません。

これら2つの分析を比較します。

x1 <- rnorm(50, 1, 1e-15)
y1 <- rnorm(50, 1 + 1e-15, 1e-15)
t.test(x1, y1)  #Should throw an error

x2 <- rnorm(50, 0, 1e-15)
y2 <- rnorm(50, 1e-15, 1e-15)
t.test(x2, y2)  #ok

最初のケースでは、数字の違いは多くの有効数字の後にのみ発生するため、データは「ほぼ一定」です。 2番目のケースでは、数値間の差の大きさは同じですが、数値自体の大きさと比較すると大きくなります。


E3boで述べたように、Rmpfrパッケージを使用して、複数精度の浮動小数点数を使用できます。

mpfr("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825")

これらは、通常の(倍精度)numericベクトルよりも低速でメモリ集約型ですが、条件の悪い問題や不安定なアルゴリズムがある場合に役立ちます。

45
Richie Cotton

自分で出力全体を作成する場合は、sprintf()を使用できます。

> sprintf("%.10f",0.25)
[1] "0.2500000000"

浮動小数点数を10個の小数点でフォーマットすることを指定します(%.10ffは浮動小数点数で、.10は10個の小数点を指定します)。

Rのより高いレベルの関数に正確な桁数を出力させる方法は知りません。

Rの通常の数字を印刷する場合、100桁の表示は意味がありません。64ビットの倍精度を使用して得られる最高の精度は10進数で約16桁です(システムの.Machine $ double.epsを参照)。残りの数字はジャンクになります。