10k x 10k 矩阵 malloc 好奇在 C 中



可能的重复项:
如何对大量浮点数求和?

我有一个矩阵"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);

正如我所期望的那样,上面的代码打印"总和: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 添加到值为> 16777216 (2^24) 的浮点数中,但可以添加 2.0 或 0.1:

#include <stdio.h>
int main(void)
{
    float f = 16777220;
    printf("f = %fn", f + 1);
    printf("f = %fn", f + 2);
    printf("f = %fn", f + 0.1);
    return 0;
}

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

相关内容

  • 没有找到相关文章