尝试生成大型数据集时出现问题

时间:2017-07-21 22:23:10

标签: c gcc

我想创建60M元素的大型数据集,每个元素dim = 256(稍后将写入文件)。我写了以下内容:

#define N 60000000L
#define DIM 256

int main(){
    int i,j;
    double tmp, *data;
    data = calloc(N*DIM, sizeof(double));
    tmp = 1.0 / RAND_MAX;
    for (i = 0; i < N*DIM; i++) data[i] = (double) rand() * tmp - 0.5;
    // TODO: Save data buffer in file
    free(data);
}

但是我收到了这个错误:

main.c:111:19: warning: comparison of constant 7695802368 with expression of type 'int' is always
      true [-Wtautological-constant-out-of-range-compare]
    for (i = 0; i < N*DIM; i++) data[i] = (double) rand() * tmp - 0.5;
                ~ ^ ~~~~~~~~~~
1 warning generated.

有人可以提示我,为什么这个问题存在以及如何摆脱它?谢谢

3 个答案:

答案 0 :(得分:2)

您计算机上的int类型无法容纳足够大的数字&gt; = 7695802368.这意味着您的int类型为32位。您需要使用64位数字long long int或更合适的unsigned long long int

答案 1 :(得分:2)

对内存分配和索引使用size_t数学。

这是用于索引/尺寸调整的Goldilocks类型,既不太窄也不太宽。请记住,它是一些无符号类型。

//#define N 60000000L
#define N ((size_t) 60000000u)
#define DIM 256

int main(){
    size_t i;// use the best type for indexing
    double tmp, *data;
    size_t n = N*DIM;
    data = calloc(n, sizeof *data);  // de-ref the pointer, 
    if (data) { // check allocation
      tmp = 1.0 / RAND_MAX;
      for (i = 0; i < n; i++) {
        data[i] = (double) rand() * tmp - 0.5;

答案 2 :(得分:1)

警告为您解释:您正在测试一个有符号整数(可能最大值为2,147,483,647,并且显然小于您正在测试的值,考虑到您的编译器警告)以查看其值是否更少超过70亿的价值:它永远是真的。你有意做i < N吗?