我正在处理一个带有十二位ID号的CSV文件,该文件太长而无法容纳32位整数。当我在没有指定列类的情况下将它们读入data.table
时,这些数字变成非常小的浮点数。这是一个单列CSV文件示例:
A
540045001186
540123000977
这是fread
的结果,它没有发出警告信息:
A
1: 2.668177e-312
2: 2.668562e-312
我认为CSV条目被读取为64位整数,但后来被误解为64位浮点数的二进制表示。我的证据是这个C程序打印8 8 2.668177e-312
(如果我将联合定义中的long int i
更改为int i
或unsigned int i
,则浮点数会改变):
#include <stdio.h>
typedef union {
long int i;
double f;
} union_t;
int main(void) {
union_t u;
u.i = 540045001186; /* first entry in the CSV file */
printf("%d %d %e\n", sizeof(long int), sizeof(double), u.f);
return 0;
}
读取一个整数的位作为一个浮点似乎是一个非常奇怪的默认强制,我更惊讶的是我没有得到任何警告。这是一个错误吗?这是sessionInfo()
的输出。请注意,我正在运行Cygwin预编译包,这会导致其他人无法在其他平台上重现的错误(for example)。
R version 3.4.0 (2017-04-21)
Platform: x86_64-unknown-cygwin (64-bit)
Running under: CYGWIN_NT-6.1 INT-3A02 2.8.1(0.312/5/3) 2017-07-03 14:11 x86_64 Cygwin
Matrix products: default
LAPACK: /usr/lib/R/modules/lapack.dll
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] data.table_1.10.4
loaded via a namespace (and not attached):
[1] compiler_3.4.0