控制R中打印输出的小数位数

时间:2010-02-18 09:48:37

标签: r precision digits r-faq output-formatting

R中有一个选项可以控制数字显示。例如:

options(digits=10)

应该将计算结果以10位数字给出,直到R会话结束。在R的帮助文件中,digits参数的定义如下:

  

digits:控制位数   打印数值时打印。   这只是一个建议。有效值   是 1 ... 22 ,默认 7

所以,它说这只是一个建议。如果我想总是显示10位数而不是更多或更少,该怎么办?

我的第二个问题是,如果我想显示超过22位数,即更精​​确的计算如100位数,该怎么办?是否可以使用基础R,或者我是否需要额外的包/功能?

修改:感谢jmoy的建议,我尝试了sprintf("%.100f",pi)并给出了

[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"

有48位小数。这是R可以处理的最大限制吗?

3 个答案:

答案 0 :(得分:45)

这只是一个建议的原因是你可以很容易地写一个忽略选项值的打印功能。内置的打印和格式化功能确实使用options值作为默认值。

关于第二个问题,由于R使用有限精度算术,因此您的答案在15或16位小数之后不准确,因此通常不需要更多。 gmprcdd包处理多个精度算术(通过gmp库的接口),但这主要与大整数相关,而不是你的双精度的更多小数位。

MathematicaMaple将允许您提供您心愿所需的小数位数。

编辑:
考虑小数位和重要数字之间的区别可能是有用的。如果您正在进行依赖于超出第15位重要数字的差异的统计测试,那么您的分析几乎肯定是垃圾。

另一方面,如果你只处理非常小的数字,这不是一个问题,因为R可以处理小到.Machine$double.xmin的数字(通常是2e-308)。

比较这两个分析。

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

在第一种情况下,数字之间的差异仅在许多有效数字之后出现,因此数据“几乎不变”。在第二种情况下,虽然数字之间差异的大小是相同的,但与数字本身的数量相比,它们很大。


如e3bo所述,您可以使用Rmpfr包使用多精度浮点数。

mpfr("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825")

使用它们比常规(双精度)numeric向量更慢且占用更多内存,但如果您的条件问题不稳定或算法不稳定,则会很有用。

答案 1 :(得分:39)

如果您自己制作整个输出,可以使用sprintf(),例如

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

指定要格式化带有十个小数点的浮点数(在%.10ff用于浮点数,.10指定十个小数点。

我不知道有什么方法可以强迫R的更高级别的功能打印确切的位数。

如果要打印R的常用数字,则显示100位数字没有意义,因为使用64位双精度数可获得的最佳精度是大约16位十进制数字(请查看系统上的.Machine $ double.eps)。剩下的数字只是垃圾。

答案 2 :(得分: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,但是如果将其设置为固定的打印小数选项,例如sprintf("%.10f", sum(elements)),则会生成冗余零。为-876.5432100000

按照此处的教程进行操作:printing decimal numbers,如果能够确定某个数字中有多少个十进制数字(如-876.54321中的此处),则需要打印5个十进制数字,那么我们可以设置设置format函数的参数,如下所示:

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

我们可以根据每次查询更改decimal_length,以满足不同的十进制打印要求。