10k 10k矩阵malloc好奇心c

时间:2012-11-24 05:58:50

标签: c matrix malloc

  

可能重复:
  how to sum a large number of float number?

我有一个矩阵'x',10,000个元素乘以10,000个元素。

在第一种情况下,我声明矩阵如:

int n = 10000;
unsigned int size_M = n*n;
unsigned int mem_size_M = sizeof(int)*size_M;
int* x = (int*)malloc(mem_size_M);

步骤(1)初始化矩阵:

for(i=0;i<n;i++)
    for(j=0;j<n;j++)
        x[i*n+j] = 1;

步骤(2)对矩阵的元素求和并打印总数:

for(i=0i<n;i++)
    for(j=0j<n;j++)          
        sum +=x[i*n+j];

printf("sum: %d \n", sum);

正如我所料,上面的代码打印'sum:100000000'。

但是,如果我声明矩阵如:

int n = 10000;
float size_M = n * n;
float mem_size_M = sizeof(float) * size_M;
float* x = (float*)malloc(mem_size_M);

再次执行步骤1和2,不打印正确答案,而是“16777216”。为什么是这样?

答案:要获得适当的答案,请进行类型转换......

sum +=(int)x[i*n+j];

1 个答案:

答案 0 :(得分:2)

这是因为float类型的精度限制。你不能只是将1.0添加到浮点数值&gt; 16777216(2 ^ 24),但您可以添加2.0或0.1:

#include <stdio.h>

int main(void)
{
    float f = 16777220;
    printf("f = %f\n", f + 1);
    printf("f = %f\n", f + 2);
    printf("f = %f\n", f + 0.1);
    return 0;
}

IEEE-754标准浮点数有4个字节,由符号位,8位超出127个二进制指数和 23位尾数组成。解释为什么会发生这种情况有点复杂,但我可以说这是操作错误达到最大值时的极端情况。