为什么10的幂在科学记数法上以5次方式打印?

Ric*_*ven 41 r scientific-notation

我想知道10的权力是否以及如何与控制台中科学记数法的印刷相关.我搜索过R docs并且没有发现任何相关内容,或者我真的理解.

首先,我scipendigits设置

unlist(options("scipen", "digits"))
# scipen digits 
#      0      7 
Run Code Online (Sandbox Code Playgroud)

现在,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
Run Code Online (Sandbox Code Playgroud)

有趣的是,这不会发生了一些其他的数字大于10.

11^(1:5)
# [1]     11    121   1331  14641 161051
Run Code Online (Sandbox Code Playgroud)

从以下情况来看,5位数似乎很重要.

100^(1:2)
# [1]   100 10000
100^(1:3)
# [1] 1e+02 1e+04 1e+06
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

为什么科学记数法在第4和第5次幂之间激活10次而不是其他数字?数字5是否显着?此外,为什么5而不是更接近22的最大数字选项的数字?

Jos*_*ien 42

嗯,答案实际上就是在in的定义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
Run Code Online (Sandbox Code Playgroud)

接下来,检查一些也以大量零结尾的数字,但是其在科学记数法中的表示将需要使用a ..对于这些数字,一旦你有6个或更多的零(即超过一个.和字符占用的5个字符),将使用科学记数法e+nn.

1.1e+06
1100000
# [1] 1100000


1.1e+07
11000000     ##  <- wider
# [1] 1.1e+07
Run Code Online (Sandbox Code Playgroud)

关于权衡推理得到大多数其他的数字,这两者的值棘手一点options("scipen"),并options("digits")开始发挥作用,但总的想法是完全一样的.

要查看一些稍微令人惊讶的并发症,您可能希望将以下内容粘贴到控制台中(可能在首先尝试预测每个系列中的哪个位置切换到科学记数法之后).

100001
1000001
10000001
100000001
1000000001
10000000001
100000000001
1000000000001

111111
1111111
11111111
111111111
1111111111
11111111111
111111111111
1111111111111
Run Code Online (Sandbox Code Playgroud)


MrF*_*ick 8

我对你的问题究竟是什么感到困惑; 或者,更具体地说,你如何使用这个问题的答案以某种方式改变/控制R的行为.你试图以某种方式格式化数字?有更好的方法来做到这一点.

当您键入这样的值时,结果将通过其中一个print()命令隐式运行,以便"很好地"格式化到控制台.每当事情必须在屏幕上看起来"好"时,执行此操作的代码通常很难看.这里的大部分代码都由formatReal函数和辅助 科学函数处理.后者跟踪数字的以下信息

/* 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
 */
Run Code Online (Sandbox Code Playgroud)

然后前一个函数使用此信息尝试通过平衡小数点左侧和右侧的值来制作"漂亮"的数字.它是许多事物的组合,例如数量的数量级和有效数字的数量以及形成scipen选项的环境影响等.

print()只是为了让事情看起来"美好".究竟什么是好的取决于向量中的所有值.你会发现该代码中很少有硬截止点; 它很适应.没有简单的方法来简明地描述它在一般情况下所做的一切(这听起来像你要求的那样).

唯一可以确定的是,如果您需要以某种方式格式化您的数字,请使用类似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
Run Code Online (Sandbox Code Playgroud)