Rでの印刷出力の10進桁数の制御


110

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が処理できる最大制限ですか?


5
piの最初の15桁のみが正確です。真の値joyofpi.com/pi.htmlと
リッチーコットン

1
あなたが正しい。Rでなぜ違うのですか?
Mehper C. Palavuzlar、2010


2
Mehper:私はあなたが読みたいかもしれませんR.あなたの中の数字の計算表現を誤解していると思いen.wikipedia.org/wiki/Floating_pointを
シェーン

比較として、Pythonはまったく同じことを行いpython -c "import math; print(format(math.pi, '.100f'))"ます。結果はpi48の「実際の」10進数で、残りの52桁はゼロで埋められます。
syntaxerror

回答:


49

これが単なる提案である理由は、オプションの値を無視する印刷関数を非常に簡単に記述できるためです。組み込みの印刷およびフォーマット関数はoptions、デフォルトとして値を使用します。

2番目の質問については、Rは有限精度の演算を使用するため、答えは小数点以下15桁または16桁を超えて正確ではないため、一般に、それ以上は必要ありません。GMPRCDDパッケージは、(GMPライブラリにinteraceを経由して)複数の精度演算を扱うが、これは主に、大きな整数ではなく、あなたのダブルスのためのより多くの小数点以下の桁数に関係しています。

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ベクトルよりも低速でメモリ使用量が多くなりますが、条件の悪い問題や不安定なアルゴリズムがある場合に役立ちます。


4
このRwikiページが実証、Rmpfrパッケージは Rの高精度浮動小数点演算を可能にする
e3bo

しかし、RmpfrをRパッケージで使用して、精度を向上させることはできますか?または、内部でコード化された関数のみを使用できますか?
skan 2015年

2
「15番目の有意な数値を超える差異に依存する統計検定を行っている場合、分析はほぼ間違いなくジャンクです。」しかし、私はそれがジャンクであると結論付ける桁数は何だろうと思いました、そして私は5だと思いましたが、私は訂正して立って喜んでいます。
PatrickT

46

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

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

あなたは(で10進ポイントを持つ浮動小数点数をフォーマットしたい指定floatとのためにある指定10進ポイント)。%.10ff.10

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

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


実際、私が適用したいくつかの特別なカイ二乗検定では、正確な結果を得るために数百の小数が必要でした。また、piには数千の小数があります。だから100桁くらいかな。
Mehper C. Palavuzlar、2010

14
piの桁数は無限です。コンピュータがそれらを保存できるという意味ではありません。
シェーン

これはMathematicaがRより優れているシナリオだと思います
skan

1
@skan Mathematicaは無限小数を格納すると思いますか?
グレゴールトーマス

@Gregorはもちろんできませんが、記憶が許す限り多くの桁を使用できます。
skan 2017年

1

必要に応じて印刷する10進数の数を制御できるもう1つのソリューション(冗長なゼロを印刷したくない場合)

たとえば、ベクターがelementsありsum、それを取得したい場合

elements <- c(-1e-05, -2e-04, -3e-03, -4e-02, -5e-01, -6e+00, -7e+01, -8e+02)
sum(elements)
## -876.5432

どうやら、最後のデジタルは1切り捨てられているので、理想的な結果はになるはずですが-876.54321、固定印刷10進数オプションとして設定されている場合、たとえばsprintf("%.10f", sum(elements))、冗長なゼロが次のように生成されます。-876.5432100000

ここでのチュートリアルに従ってください:10進数の印刷、ここでのように、特定の数値の10進数の数を特定できる場合-876.54321、5桁の10進数を印刷する必要がありformat、次のように関数のパラメーターを設定できます。

decimal_length <- 5
formatC(sum(elements), format = "f", digits = decimal_length)
## -876.54321

decimal_length毎回のクエリに基づいてを変更できるため、異なる10進数の印刷要件を満たすことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.