首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >10k×10k矩阵malloc好奇性

10k×10k矩阵malloc好奇性
EN

Stack Overflow用户
提问于 2012-11-24 05:58:50
回答 1查看 161关注 0票数 1

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

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

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

代码语言:javascript
复制
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)初始化矩阵:

代码语言:javascript
复制
for(i=0;i<n;i++)
    for(j=0;j<n;j++)
        x[i*n+j] = 1;

步骤(2)将矩阵的元素相加并打印总数:

代码语言:javascript
复制
for(i=0i<n;i++)
    for(j=0j<n;j++)          
        sum +=x[i*n+j];

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

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

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

代码语言:javascript
复制
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”。为什么会这样呢?

答案:为了得到合适的答案,进行类型转换.

代码语言:javascript
复制
sum +=(int)x[i*n+j];
EN

回答 1

Stack Overflow用户

发布于 2012-11-24 08:21:58

这是由于浮点数类型的精度限制而发生的。您不能仅仅将1.0添加到值> 16777216 (2^24)的浮动中,而是可以添加2.0或0.1:

代码语言:javascript
复制
#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位尾数.精确地解释为什么会发生这种情况有点复杂,但我可以说,当操作错误达到最大值时,这是一个极端的情况。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13538740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档