135

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

options(digits=10)

R セッションが終了するまで、計算結果が 10 桁で表示されるはずです。R のヘルプ ファイルでは、digits パラメータの定義は次のとおりです。

桁数: 数値を印刷するときに印刷する桁数を制御します。あくまでも提案です。有効な値は1 ~ 22で、デフォルトは7です。

したがって、これは単なる提案であると書かれています。多かれ少なかれではなく、常に 10 桁を表示したい場合はどうすればよいですか?

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

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

[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"

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

4

3 に答える 3

59

これが単なる提案である理由は、オプション値を無視する印刷関数を非常に簡単に作成できるためです。組み込みの印刷および書式設定関数は、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ベクトルよりも遅く、メモリを多く消費しますが、条件の悪い問題や不安定なアルゴリズムがある場合に役立ちます。

于 2010-02-18T10:58:10.600 に答える
54

出力全体を自分で作成している場合は、次のように使用できますsprintf()

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

小数点以下 10 桁の浮動小数点数をフォーマットすることを指定します (は float を表し、 は%.10f小数点以下 10 桁を指定します)。f.10

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

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

于 2010-02-18T10:49:03.607 に答える