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

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

options(digits=10) 

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

位数:控制打印数字值时要打印的位数。 这只是一个build议。 有效值为1 … 22 ,默认为7

所以说这只是一个build议。 如果我喜欢总是显示10位数字,不多或less?

我的第二个问题是,如果我想显示超过22位数字,即更精确的计算(如100位数),该怎么办? 基地R是可能的,还是我需要一个额外的软件包/function呢?

编辑:感谢jmoy的build议,我试过sprintf("%.100f",pi) ,它给了

 [1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000" 

其中有48位小数。 这是R可以处理的最大限制吗? 实际上pi有无限的小数。

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

至于第二个问题,由于R使用有限精度算术,所以你的答案在十进制的十六或十六位以后是不准确的,所以一般来说不需要更多。 gmp和rcdd包处理多个精度算术(通过intemp到gmp库),但是这主要与大整数有关,而不是更多的小数位。

Mathematica或Maple将允许您input您心中所希望的小数位数。

编辑:
考虑小数位和有效数字之间的差异可能是有用的。 如果您正在进行统计testing,而这些testing依赖于第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 

在第一种情况下,数字之间的差异只发生在许多有效数字之后,因此数据是“几乎不变的”。 在第二种情况下,尽pipe数字之间的差异的大小是相同的,但与数字本身的大小相比,它们是大的。


正如e3bo所提到的,您可以使用Rmpfr包使用多精度浮点数。

 mpfr("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825") 

与常规(双精度) numeric向量相比,这些速度较慢且需要更多的内存,但如果您的条件不佳或algorithm不稳定,则会很有用。

如果您自己生成整个输出,则可以使用sprintf

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

我不知道有什么方法可以强制R的高级function打印确切的数字。

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