【问题标题】:Why do powers of 10 print in scientific notation at the 5th power?为什么科学计数法中 10 的幂是 5 次方?
【发布时间】:2014-11-09 15:53:34
【问题描述】:

我想知道 10 的幂是否以及如何与在控制台中打印科学记数法相关。我搜索了 R 文档,但没有找到任何相关或我真正理解的内容。

首先,我的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

所以我的问题是:

为什么科学记数法在 10 的 4 次方和 5 次方之间激活,而不是其他数字?数字 5 重要吗?此外,为什么是 5 而不是更接近最大位数选项 22 的数字?

【问题讨论】:

    标签: r scientific-notation


    【解决方案1】:

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

    ‘scipen’:整数。决定打印时要施加的惩罚 固定或指数表示法的数值。积极的 价值观偏向固定,负向科学 符号:固定符号将是首选,除非它更多 比‘scipen’数字更宽。

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

    但是,在第三种情况下,固定表示法更宽(即“多于 0 位宽”),因为 5 个零的字符数比使用 e+nn 表示相同值的 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
    

    【讨论】:

      【解决方案2】:

      我对你的问题到底是什么感到困惑;或者,更具体地说,你将如何使用这个问题的答案来以某种方式改变/控制 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
      

      【讨论】:

      • 澄清一下,我并不是要改变这种行为。相反,我想知道为什么这似乎只发生在例如10^(1:5) 而不是 11^(1:5)。 10 的倍数似乎很重要,当数字是 10 的倍数时,5 位数字也很重要。但是 R 正在“美化”这些数字确实是有道理的。
      • 10^(1:5)11^(1:5)的区别主要是由于有效位数的不同。当你做 10 的幂时,当你跳到科学记数法时你不会丢失任何信息。但是,当您使用 11 作为基数时,您可能会丢失数字。
      猜你喜欢
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 1970-01-01
      相关资源
      最近更新 更多