float数组的最大索引范围?

时间:2015-02-04 13:43:56

标签: c

我想模拟10 ^ 10单位质量粒子的质量分布代码。

但是这个代码只有在粒子数为10 ^ 8时才有效。

long par = 85000000;
float p[85000000][2];

如果尺寸达到10 ^ 9或10 ^ 10

,则显示错误
  • "重定位被截断以适应"

long par = 85000000;
float p[85000000][2];

如何找到float数组的最大可能索引范围?

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <sys/time.h>

long double net[4096][4096];
int max = 4000;
long par = 85000000;
float p[85000000][2];

int main(int argc, char *argv[]) {
    int i;
    for( i = 0; i < par/1000; i++) {
        p[i][0]= ((long double)rand()/(long double)(RAND_MAX) * (long double)max);
        p[i][1]= ((long double)rand()/(long double)(RAND_MAX) * (long double)max);
    }

    clock_t begin = clock();

    for ( i = 0; i < par/1000; i++) {
        double x = p[i][0];
        double y = p[i][1];

        int left = (int)floor(x);
        int right = left + 1;

        if ( left >= 4095)
            printf("out of bound left is %d/n", left);

        int bottom = (int)floor(y);
        int top = bottom +1;

        double fL = x - left;
        double fR = 1 - fL;

        double fB = y - bottom;
        double fT = 1 - fB;

        net[left][bottom]   =   net[left][bottom]   +( fT * fR ) ;
        net[right][bottom]  =   net[right][bottom]  +( fT * fL ) ;
        net[left][top]      =   net[left][top]      +( fB * fR ) ;
        net[right][top]     =   net[right][top]     +( fB * fL ) ;
    }

    clock_t close = clock();

    FILE *f = fopen("file.txt", "a");
    if (!f) {
            printf("Error opening file!\n");
            exit(1);
    }

    fprintf (f,"Computation time for grid size %d X %d and %ld particle is "
        "%4.6lf ,\n",max, max,par,(double)(close-begin) );

    fclose(f);
}

1 个答案:

答案 0 :(得分:2)

您正在使用分配达到堆栈限制,您应该使用malloc,它在堆(a.k.a。动态)内存上进行分配。然后你可以使用尽可能多的内存,就像你的操作系统允许的那样。

您可以使用以下语法使用它:

float p[];
p = malloc(85000000 * sizeof(float));

甚至有Wikipedia article关于malloc和类似的功能。

作为旁注:此类错误是此网站的namesake:)