首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在第5次用科学符号打印10次的幂次?

为什么在第5次用科学符号打印10次的幂次?
EN

Stack Overflow用户
提问于 2014-09-16 02:02:21
回答 2查看 4.3K关注 0票数 41

我想知道10的权力是否和如何与在控制台中印刷科学符号有关。我已经搜索了R文档,但没有发现任何相关的东西,或者是我真正理解的。

首先,我的scipendigits设置是

代码语言:javascript
复制
unlist(options("scipen", "digits"))
# scipen digits 
#      0      7 

现在,10的功率通常被打印到第4次,然后在第5次时打印开关到科学符号。

代码语言:javascript
复制
10^(1:4)
# [1]    10   100  1000 10000
10^(1:5)
# [1] 1e+01 1e+02 1e+03 1e+04 1e+05

有趣的是,对于其他大于10的数字,这种情况不会发生。

代码语言:javascript
复制
11^(1:5)
# [1]     11    121   1331  14641 161051

从下面看,5位数字似乎很重要。

代码语言:javascript
复制
100^(1:2)
# [1]   100 10000
100^(1:3)
# [1] 1e+02 1e+04 1e+06

所以我的问题是:

为什么科学表示法在第4次和第5次之间激活为10,而不用于其他数字?数字5有意义吗?此外,为什么5而不是接近22的最大数字选项的数字呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-16 04:14:15

实际上,答案就在scipen?options中的定义中,尽管如果不使用一些示例,很难理解它的含义:

整数。在决定用固定或指数符号打印数字值时要施加的惩罚。正值偏向固定符号,负值偏向科学表示法:固定表示法将是首选的,除非它比“枕”数字更宽。

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

但是,在第三种情况下,固定表示法更宽(即“大于0位”),因为5个零比使用e+nn表示相同值的4个字符多。因此,在这种情况下,科学表示法是首选的

代码语言:javascript
复制
1e+03
1000
# [1] 1000

1e+04
10000
# [1] 10000

1e+05
100000      ## <- wider
# [1] 1e+05

接下来,检查一些以大量零结尾的数字,但是它的科学表示法需要使用.。对于这些数字,一旦有6个或更多的零(即超过一个.e+nn字符占用的5个字符),就会使用科学符号。

代码语言:javascript
复制
1.1e+06
1100000
# [1] 1100000


1.1e+07
11000000     ##  <- wider
# [1] 1.1e+07

对于大多数其他数字来说,关于权衡的推理要复杂一些,因为对这些数字来说,options("scipen")options("digits")的值都起作用,但总体观点完全相同。

要了解其中一些稍微令人惊讶的复杂情况,您可能需要将以下内容粘贴到您的控制台中(可能是在第一次尝试预测每个系列中将在哪里发生科学标记之后)。

代码语言:javascript
复制
100001
1000001
10000001
100000001
1000000001
10000000001
100000000001
1000000000001

111111
1111111
11111111
111111111
1111111111
11111111111
111111111111
1111111111111
票数 42
EN

Stack Overflow用户

发布于 2014-09-16 04:07:38

我搞不懂你的问题到底是什么;或者,更具体地说,你会如何用这个问题的答案来改变/控制R的行为,你想用某种方式格式化数字吗?有更好的方法来做到这一点。

当您键入类似的值时,结果将通过要“很好”格式化到控制台的print()命令之一隐式运行。每当屏幕上的东西看起来很“好看”时,这样做的代码通常都很难看。在这里,大部分代码由formatReal函数和助手科学函数处理。后者跟踪数字的下列信息

代码语言:javascript
复制
/* 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的特点,因为这是最棘手的事情发生的地方。但是当您使用整数时,请注意不同之处。

代码语言:javascript
复制
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
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25859609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档