【问题标题】:How does bit64 store long long int in a doublebit64如何将long long int存储在double中
【发布时间】:2014-11-07 06:13:57
【问题描述】:

将整数存储为双精度数时,在 2^53 之后发生精度损失:

> print(2^53, digits=20)
[1] 9007199254740992
> print(2^53+1, digits=20)
[1] 9007199254740992

R 中的bit64 包可以存储最大为 2^63 的整数:

> library(bit64)
> print(as.integer64(2)^53, digits=20)
[1] 9007199254740992
> print(as.integer64(2)^53+1, digits=20)
[1] 9007199254740993

但是看起来 integer64 对象只是用一个特殊的类装饰的双精度:

> typeof(as.integer64(2)^53)
[1] "double"

一个 32 位的 double 怎么可能存储一个 64 位的整数?

【问题讨论】:

  • bit64 定义了一个+.integer64 方法。这就是您的两个示例之间的区别。
  • @mdsumner 即使是 x86 架构师?
  • 是的。这就是“双”的意思。 2*4 字节,而不是“单个”。 R 没有现成的 32 位浮点类型

标签: r int64


【解决方案1】:

我知道这是一个老问题,但它是在我进行的搜索中出现的,我能够找到答案。

正如mdsumner commented,根据定义,double 是 64 位的。双打存储在 R 的 REALSXP 类型中。 bit64 包将其各种integer64 方法的输入转换为uint64_t(C99 支持)并将64 位存储在R 的REALSXP 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 2013-03-15
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    相关资源
    最近更新 更多