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

Meh*_*lar 103 precision r digits output-formatting r-faq

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

options(digits=10)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"
Run Code Online (Sandbox Code Playgroud)

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

Ric*_*ton 45

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

至于第二个问题,由于R使用有限精度算术,因此您的答案在15或16位小数之后不准确,因此通常不需要更多.在GMPRCDD包处理多精度运算(通过interace的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
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,数字之间的差异仅在许多有效数字之后出现,因此数据"几乎不变".在第二种情况下,尽管数字之间的差异大小相同,但与数字本身的大小相比,它们很大.


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

mpfr("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825")
Run Code Online (Sandbox Code Playgroud)

与常规(双精度)numeric向量相比,它们使用速度更慢且占用内存更多,但如果您的条件不良或算法不稳定,则可能非常有用.

  • 正如[这个Rwiki页面](http://rwiki.sciviews.org/doku.php?id=misc:r_accuracy:high_precision_arithmetic)所示,[Rmpfr包](http://cran.at.r-project.org /web/packages/Rmpfr/index.html)允许在R中进行高精度浮点运算. (4认同)
  • 我只是在想,"如果你做的统计测试依赖于超过第15位重要数字的差异,那么你的分析几乎肯定是垃圾." 但是我想知道我会得出它的垃圾的数字是多少,我想5,但我很乐意站出来纠正. (2认同)

Jyo*_*rya 40

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

> sprintf("%.10f",0.25)
[1] "0.2500000000"
Run Code Online (Sandbox Code Playgroud)

指定要格式化带有十个小数点的浮点数(在浮点数中%.10ffis,.10指定十个小数点).

我不知道有什么方法可以强制R的更高级函数打印确切的位数.

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

  • pi具有无限小数; 这并不意味着计算机可以存储它们. (13认同)
  • @skan 您认为 Mathematica 会存储无限多的小数吗? (2认同)
  • @Gregor当然不是,但是你可以根据你的记忆力输入尽可能多的数字。 (2认同)