【问题标题】:struggling with integers (maximum integer size)与整数斗争(最大整数大小)
【发布时间】:2013-01-29 18:06:29
【问题描述】:

我使用的函数需要输入为整数。

所以我一直在尝试read up on making things integers:

y <- 3.14
as.integer(y)
[1] 3              # all cool

一切都好,但如果我有

 x <- 1639195531833
 as.integer(x)
 [1] NA
 Warning message:
 NAs introduced by coercion 

我打开了options(digits = 15),这让我感到困惑,为什么它不起作用,但在干净的会话中,它一定与科学记数法有关。

我也试图欺骗 R 但它不高兴:

  as.integer(as.character(x))
[1] 2147483647
Warning message:
inaccurate integer conversion in coercion 

我如何打败科学记数法并得到我的整数?

【问题讨论】:

  • 参见?as.integer,它告诉您整数被限制在大约 +/-2*10^9。
  • 算了。 R 中的整数仍然是 32 位的,所以你不能有大于大约 1.2E9 的整数。如果传言属实,这可能会在下一个主要的 R 版本中改变。
  • 哎哟。这需要大量的重命名。谢谢大家,我应该删除这个Q还是你想要一个答案?
  • 这是一个有效的问题,现在是一个有效的答案,所以我想说

标签: r


【解决方案1】:

R能容纳的最大整数是

.Machine$integer.max
# [1] 2147483647

这与科学记数法无关,而是与计算机实际存储数字的方式有关。无论架构如何,当前版本的 R 仍将整数存储为 32 位。不过,这可能会在未来发生变化。

另见?as.integer

目前您可以通过 int64 包访问 64 位整数

> as.integer(.Machine$integer.max)
[1] 2147483647
> # We get problems with this
> as.integer(.Machine$integer.max + 1)
[1] NA
Warning message:
NAs introduced by coercion 
> # But if we use int64
> library(int64)
> as.int64(.Machine$integer.max) + 1L
[1] 2147483648

【讨论】:

    【解决方案2】:

    更新 Dason 的答案(没有足够的声誉发表评论):

    int64 包现已弃用,但现在有一个名为 bit64 的包。我能够使用它达到相同的结果。语法从“as.int64”到“as.integer64”仅略有变化。

    library(bit64)
    as.integer64(.Machine$integer.max) + 1L
    

    【讨论】:

      【解决方案3】:

      似乎 int64 已被弃用。我使用包bit64,方法as.integer64()并解决了问题。详情参考here

      【讨论】:

        【解决方案4】:

        有些类可以处理大整数。我使用 int64,它的小插图在这里:

        http://cran.r-project.org/web/packages/int64/vignettes/int64.pdf

        要使用它,您只需将一些正常数字放入该类,然后您可以将它添加或乘以正常 32 位整数最大值的阈值。祝你好运。

        【讨论】:

        • +1 这看起来很有趣,谢谢,虽然让这个类进入我正在运行的函数可能很难,但很高兴知道。
        猜你喜欢
        • 2012-11-07
        • 1970-01-01
        • 2013-12-26
        • 1970-01-01
        • 2011-12-17
        • 2013-06-27
        • 2012-04-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多