【问题标题】:R largest/smallest representable numbersR 最大/最小可表示数字
【发布时间】:2016-11-05 00:50:35
【问题描述】:

我正在尝试获取 R 中最大/最小的可表示数字。

输入“.Machine”后

我明白了:

$double.xmin
[1] 2.225074e-308

$double.xmax
[1] 1.797693e+308

但是,即使我在 R 命令提示符下键入 2.225074e-309,我也会得到 2.225074e-309 而不是预期的 0

我如何找到最大/最小的数字,加或减 1 会导致 Inf(最大数字加 1)或 0(最小数字减 1)?

【问题讨论】:

  • 我认为这取决于机器和编程语言。无论如何,除非我遗漏了什么,.Machine 没有给我想要的结果
  • 这些是IEEE 双精度最大值和最小值。
  • 上限是准确的(这是有道理的,因为浮点不是大数字的问题)。我尝试小到 2.470329e-324,但由于浮点错误,它被表示为 4.940656e-324,这可能是最小值设置在它所在位置的原因。对于非常大的数字,如果需要,可以使用 gmp 之类的软件包,让您超越 R 的界限。

标签: r data-representation


【解决方案1】:

.Machine$double.xmin 给出满足IEEE 754 technical standard 浮点计算要求的最小正数的值。正如Wikipedia article 中提到的双精度浮点数,该标准要求:

如果将最多 15 个有效数字的十进制字符串转换为 IEEE 754 双精度表示,然后再转换回具有相同有效数字的字符串,则最终字符串应与原始字符串匹配。如果将 IEEE 754 双精度转换为具有至少 17 位有效数字的十进制字符串,然后再转换回双精度,则最终数字必须与原始数字匹配。

同一篇文章接着指出,通过牺牲精度,甚至可以表示更小的正数(不符合标准的精度要求):

指数的 11 位宽度允许表示 10-308 和 10308 之间的数字,精度为 15-17 位小数。通过牺牲精度,次正规表示允许更小的值,最大约为 5 × 10-324

正如?.Machine 的“详细信息”部分所述,R 的双精度对象的行为方式正是如此:

请注意,在大多数平台上,正值小于 '.Machine$double.xmin' 可能会出现。在典型的 R 平台上 最小的正双精度约为'5e-324'。

要确认这是可以使用 R 的双精度数表示的最小正值并查看精度损失的成本,请尝试以下一些操作:

5e-324
# [1] 4.940656e-324
2e-324
# [1] 0
1.4 * 5e-324
# [1] 4.940656e-324
1.6 * 5e-324
# [1] 9.881313e-324

【讨论】:

    【解决方案2】:

    以下是一些使用 SAS、IEEE 754 Big Endian 的表示形式?

    data _null_;
        y=constant('big');
        put y hex16.;
        put y E21.3;
    run;quit;
    

    最大的

    7FEFFFFFFFFFFFFF 1.79769313486230E+308

    data _null_;
        y=constant('small');
        put y hex16.;
        put y E21.3;
    run;quit;
    

    最小的

    0010000000000000 2.22507385850720E-308

    我不确定最小的,因为 SAS 可能会为缺失留出一些值。

    【讨论】:

      猜你喜欢
      • 2019-04-30
      • 1970-01-01
      • 2018-02-18
      • 1970-01-01
      • 2014-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-14
      相关资源
      最近更新 更多