我想知道10的权力是否以及如何与控制台中科学记数法的印刷相关。我搜索过R docs并且没有发现任何相关的内容,或者我真的很了解。
首先,我的scipen
和digits
设置为
unlist(options("scipen", "digits"))
# scipen digits
# 0 7
现在,10的幂通常打印到4次方,然后在5次方打印到科学记数法。
10^(1:4)
# [1] 10 100 1000 10000
10^(1:5)
# [1] 1e+01 1e+02 1e+03 1e+04 1e+05
有趣的是,某些大于10的其他数字不会发生这种情况。
11^(1:5)
# [1] 11 121 1331 14641 161051
从以下情况来看,5位数似乎很重要。
100^(1:2)
# [1] 100 10000
100^(1:3)
# [1] 1e+02 1e+04 1e+06
所以我的问题是:
为什么科学记数法在4号和5号电源之间激活10而不是其他号码?数字5是否显着?此外,为什么5而不是更接近22的最大数字选项?
答案 0 :(得分:42)
嗯,实际上答案实际上是scipen
中?options
的定义,虽然很难理解它的含义,但没有玩弄一些例子:
'scipen':整数。决定打印时应用的惩罚 固定或指数表示法中的数值。正 价值观倾向于固定和消极的科学 符号:除非更多,否则将优先使用固定符号 比'scipen'数字更宽。
要了解这意味着什么,请检查以下三对完全相同的数字。在前两种情况下,固定符号的字符宽度小于或等于科学的宽度,因此固定符号是首选。
在第三种情况下,固定符号更宽(即"宽度超过0位"),因为5个零比用于表示相同值的4个字符更多的字符使用e+nn
。因此,在这种情况下,科学记数法是首选。
1e+03
1000
# [1] 1000
1e+04
10000
# [1] 10000
1e+05
100000 ## <- wider
# [1] 1e+05
接下来,检查一些也以大量零结尾的数字,但是其在科学记数法中的表示将需要使用.
。对于这些数字,一旦你有6个或更多的零(即超过一个.
占据的5个字符和字符e+nn
),将使用科学记数法。
1.1e+06
1100000
# [1] 1100000
1.1e+07
11000000 ## <- wider
# [1] 1.1e+07
关于权衡的推理对于大多数其他数字来说有点棘手,其中options("scipen")
和options("digits")
的值都起作用,但总体思路完全相同。
要查看一些稍微令人惊讶的并发症,您可能希望将以下内容粘贴到控制台中(可能在首先尝试预测每个系列中的哪个位置切换到科学记数法之后)。
100001
1000001
10000001
100000001
1000000001
10000000001
100000000001
1000000000001
111111
1111111
11111111
111111111
1111111111
11111111111
111111111111
1111111111111
答案 1 :(得分:8)
我对你的问题究竟是什么感到困惑;或者,更具体地说,你如何使用这个问题的答案以某种方式改变/控制R的行为。你试图以某种方式格式化数字?有更好的方法可以做到这一点。
当您键入类似的值时,结果将通过其中一个要格式化的print()
命令隐式运行,并且#34;很好地&#34;到控制台。每当事情必须看起来很好&#34;在屏幕上,执行此操作的代码通常很难看。这里的大部分代码由formatReal函数和帮助器scientific函数处理。后者跟踪数字的以下信息
/* for a number x , determine
* sgn = 1_{x < 0} {0/1}
* kpower = Exponent of 10;
* nsig = min(R_print.digits, #{significant digits of alpha})
* roundingwidens = 1 if rounding causes x to increase in width, 0 otherwise
*
* where |x| = alpha * 10^kpower and 1 <= alpha < 10
*/
然后前一个函数使用这些信息来试图让#34; nice&#34;通过平衡小数点左侧和右侧的值来查找数字。它是许多事物的组合,例如数字的数量级和有效数字的数量以及环境影响形成scipen
选项等。
print()
只是为了让事情看起来很好。&#34;究竟什么是好的取决于向量中的所有值。您在该代码中找不到几个硬截止点;它具有很强的适应性。没有简单的方法来简明地描述它在一般情况下所做的一切(这听起来像你要求的那样)。
唯一可以肯定的是,如果您需要以某种方式格式化数字,请使用sprintf()
或formatC()
等功能来进行精确控制。
当然这种行为取决于class()
,并且我指出了formatReal
这些东西,因为那是最棘手的事情发生的地方。但是在使用整数时要注意区别
c(10, 100, 1000, 10000, 100000)
# [1] 1e+01 1e+02 1e+03 1e+04 1e+05
c(10L, 100L, 1000L, 10000L, 100000L)
# [1] 10 100 1000 10000 100000