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

时间:2014-09-16 02:02:22

标签: r scientific-notation

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

首先,我的scipendigits设置为

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的最大数字选项?

2 个答案:

答案 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