1. ホーム
  2. r

[解決済み] Rでプリント出力の小数点以下の桁数を制御する

2022-06-28 16:33:45

質問

Rには桁の表示を制御するためのオプションがあります。例えば

options(digits=10)

は、Rのセッションが終了するまで、計算結果を10桁で表示することになっています。Rのヘルプでは、digitsパラメータは以下のように定義されています。

digits: 数値を表示する際に表示する桁数を指定します。 数値を表示する際の桁数を制御します。 あくまで目安です。有効な値 は 1...22 で、デフォルトの 7

ということで、これはあくまで提案であると書かれています。それ以上でも以下でもなく、常に10桁を表示したい場合はどうすればいいのでしょうか?

2つ目の質問は、22桁以上、つまり100桁のようなより正確な計算のために表示したい場合はどうしたらよいでしょうか?それは基本的な R で可能ですか、それともそのための追加のパッケージ/関数が必要ですか?

編集してください。 jmoyさんのご指摘により、試しに sprintf("%.100f",pi) を試してみたところ

[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"

となっており、小数点以下が48桁あります。これはRが処理できる最大限度でしょうか?

どのように解決するのですか?

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

2つ目の質問ですが、Rは有限精度演算を使用しているので、答えは小数点以下15桁か16桁以上では正確ではないので、一般的にはそれ以上は必要ありません。 その gmp rcdd パッケージは (gmp ライブラリへのインタフェースを介して) 多倍精度演算を扱いますが、これは倍数の小数点以下の桁数よりも大きな整数に関係することがほとんどです。

Mathematica または メイプル を使えば、小数点以下の桁数を好きなだけ指定することができます。

EDITです。

小数点以下と有効数字の違いについて考えてみるといいかもしれませんね。 もし、有効数字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 ベクトルよりも遅いですが、条件の悪い問題や不安定なアルゴリズムがある場合に有用です。