首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fread将大整数读入为integer64,如果出现变音表达式,则不会将其提升为双倍。

fread将大整数读入为integer64,如果出现变音表达式,则不会将其提升为双倍。
EN

Stack Overflow用户
提问于 2022-02-25 08:23:21
回答 1查看 41关注 0票数 1

当一个文件通过fread读取时,这些列可以被读取为integer64 (正确地是这样),但是当这些列与numeric相乘时,它们不会被向上转换为numeric (如C++或R中的integers )。虽然这是bit64包中的一种记录行为。但是,当数字被乘以等时,这是不直观的。integer64的行为与integer不同。

同样,当integer64除以integer时,会给出一个numeric变量。所以这种行为很奇怪!

那么,我们是否应该始终使用fread来使用colClasses = numeric,以便将列用于带有numeric等的算术表达式?

代码语言:javascript
复制
    file contents
    x,y
    111,0.3
    2147483648,0.3

    > d <- fread(file)     
    > print(d$x*d$y)
            x       y
1:        111       0.3
2: 2147483648       0.3

> as.integer64(111) * 8e-2
integer64
[1] 9
> as.integer64(111) * 8 / 1e2
8.88

类似地,quantiles和其他R函数将不能在integer64中正确运行。这个问题蔓延到所有使用integer64 (如nanotime )的类中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-25 09:45:59

这是记录的bit64包的行为,参见?bit64中的算术精度和强制。

我们引入64位长整数而不引入128位长双,这一事实造成了一些微妙的挑战:乘法运算符*将其第一个参数强加给integer64,但允许其第二个参数也是双倍的:第二个参数被内部胁迫为'long double‘,作为integer64返回乘法的结果。

代码语言:javascript
复制
as.integer64(111) * 8e-2
integer64
[1] 9

除法和权力^运算符也强迫他们的第一个论点向integer64和内部强迫他们的第二个论点‘长双’,他们作为双返回。

代码语言:javascript
复制
as.integer64(111) * 8 / 1e2
8.88

为了避免这种情况,可以将freadfread参数设置为"double"。要小心使用,因为有一个公开发行

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71262997

复制
相关文章

相似问题

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