我想创建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.
有人可以提示我,为什么这个问题存在以及如何摆脱它?谢谢
答案 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
吗?