当通过fread
读取文件时,列可能被读取为整数64(正确地说是这样(,但当这些列与numeric
相乘时,它们不会被上广播到numeric
(如R
中的C++或integers
(。而这是bit64
包中记录的行为。但这并不直观,当数字相乘等时,integer64
的行为与integer
不同。
此外,当integer64
除以integer
时,得到numeric
变量。所以这种行为很奇怪!
那么,对于要在具有numeric
等的算术表达式中使用的列,我们是否应该始终使用fread
和colClasses = 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
为了避免这种情况,可以将fread
的integer64
参数设置为"double"
。小心使用,因为这是一个悬而未决的问题。