控制R中打印输出的小数位数
-
21-09-2019 - |
题
R 中有一个选项可以控制数字显示。例如:
options(digits=10)
应该给出 10 位数字的计算结果,直到 R 会话结束。在R的帮助文件中,digits参数的定义如下:
数字:在打印数字值时控制要打印的数字数量。这只是一个建议。有效值是 1...22 默认情况下 7
所以,它说这只是一个建议。如果我希望始终显示 10 位数字而不是更多或更少怎么办?
我的第二个问题是,如果我想显示超过 22 位数字怎么办,即更精确的计算,例如 100 位数字?是否可以使用基础 R,或者我是否需要额外的包/函数?
编辑: 感谢jmoy的建议,我尝试了 sprintf("%.100f",pi)
它给了
[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"
有 48 位小数。这是R可以处理的最大极限吗?
解决方案
它只是一个建议的原因是您可以很容易地编写一个忽略选项值的打印函数。内置的打印和格式化功能确实使用 options
值作为默认值。
至于第二个问题,由于 R 使用有限精度算术,因此您的答案在小数点后 15 或 16 位之外就不准确,因此通常不需要更多。这 良好生产规范 和 雷克德 包处理多精度算术(通过与 gmp 库的接口),但这主要与大整数有关,而不是双精度数的更多小数位。
编辑:
考虑小数位和有效数字之间的差异可能会很有用。如果您正在进行的统计测试依赖于超过 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
向量,但如果您遇到条件较差的问题或不稳定的算法,则可能会很有用。
其他提示
如果您自己产生的整个输出,就可以使用sprintf()
,e.g。
> sprintf("%.10f",0.25)
[1] "0.2500000000"
指定要格式化十个小数点浮点数(在%.10f
的f
为浮体和所述.10
指定十个十进制点)。
我不知道强迫的r更高级功能打印的数字的确切数目的任何方式。
显示100个的数字,如果你要打印的r平常的数字,因为最好的准确性,你可以开始使用64位的双打无厘头大约是16十进制数(看。机$ double.eps您的系统上)。其余数字将只是垃圾。