data.table :: fread静默地破坏长整数

时间:2017-07-07 14:38:34

标签: r floating-point data.table

我正在处理一个带有十二位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 iunsigned 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

0 个答案:

没有答案