当一个文件通过fread读取时,这些列可以被读取为integer64 (正确地是这样),但是当这些列与numeric相乘时,它们不会被向上转换为numeric (如C++或R中的integers )。虽然这是bit64包中的一种记录行为。但是,当数字被乘以等时,这是不直观的。integer64的行为与integer不同。
同样,当integer64除以integer时,会给出一个numeric变量。所以这种行为很奇怪!
那么,我们是否应该始终使用fread来使用colClasses = numeric,以便将列用于带有numeric等的算术表达式?
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 )的类中。
发布于 2022-02-25 09:45:59
这是记录的bit64包的行为,参见?bit64中的算术精度和强制。
我们引入64位长整数而不引入128位长双,这一事实造成了一些微妙的挑战:乘法运算符*将其第一个参数强加给integer64,但允许其第二个参数也是双倍的:第二个参数被内部胁迫为'long double‘,作为integer64返回乘法的结果。
as.integer64(111) * 8e-2
integer64
[1] 9除法和权力^运算符也强迫他们的第一个论点向integer64和内部强迫他们的第二个论点‘长双’,他们作为双返回。
as.integer64(111) * 8 / 1e2
8.88为了避免这种情况,可以将fread的fread参数设置为"double"。要小心使用,因为有一个公开发行。
https://stackoverflow.com/questions/71262997
复制相似问题