r-fread将大整数读取为整数64,在算术表达式的情况下,这些整数不会被上转换为双精度



当通过fread读取文件时,列可能被读取为整数64(正确地说是这样(,但当这些列与numeric相乘时,它们不会被上广播到numeric(如R中的C++或integers(。而这是bit64包中记录的行为。但这并不直观,当数字相乘等时,integer64的行为与integer不同。

此外,当integer64除以integer时,得到numeric变量。所以这种行为很奇怪!

那么,对于要在具有numeric等的算术表达式中使用的列,我们是否应该始终使用freadcolClasses = 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(的类中

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

事实上,我们引入了64位长的整数,而没有引入128位长的双精度,这给带来了一些微妙的挑战

乘法运算符*将其第一个参数强制为整数64,但允许其第二个参数也是双参数:第二个自变量内部强制为"长双",乘法结果返回为整数64

as.integer64(111) * 8e-2
integer64
[1] 9

除法/和幂^运算符还将其第一个参数强制为整数64,并在内部将其第二个参数强制"长双精度",它们返回为双精度

as.integer64(111) * 8 / 1e2
8.88

为了避免这种情况,可以将freadinteger64参数设置为"double"。小心使用,因为这是一个悬而未决的问题。

最新更新