可能重复: 如何对大量浮点数进行求和?
我有一个矩阵'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];发布于 2012-11-24 08:21:58
这是由于浮点数类型的精度限制而发生的。您不能仅仅将1.0添加到值> 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位尾数.精确地解释为什么会发生这种情况有点复杂,但我可以说,当操作错误达到最大值时,这是一个极端的情况。
https://stackoverflow.com/questions/13538740
复制相似问题