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

问题描述 投票:41回答:2

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

r scientific-notation
2个回答
42
投票

嗯,答案实际上是scipen?options的定义,虽然很难理解它的含义而不玩一些例子:

'scipen':整数。决定以固定或指数表示法打印数值时应用的惩罚。正值偏向固定和负向科学记数:固定符号将是首选,除非它比'scipen'数字更宽。

要查看这意味着什么,请检查以下三对完全相同的数字。在前两种情况下,固定符号的字符宽度小于或等于科学的宽度,因此固定符号是优选的。

然而,在第三种情况下,固定符号更宽(即“宽度大于0位”),因为使用e+nn,5个零比用于表示相同值的4个字符更多。结果,在那种情况下,科学记数法是优选的。

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

8
投票

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

当您键入这样的值时,结果将通过其中一个print()命令隐式运行,以便“很好地”格式化到控制台。每当事情必须在屏幕上看起来“好”时,执行此操作的代码通常很难看。这里的大部分代码由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
 */

然后前一个函数使用此信息尝试通过平衡小数点左侧和右侧的值来制作“漂亮”的数字。它是许多事物的组合,例如数量的数量级和有效数字的数量以及来自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
© www.soinside.com 2019 - 2024. All rights reserved.