【发布时间】:2012-10-24 14:22:40
【问题描述】:
我正在努力解决一个因不足或溢出而失败的求和问题。
我有超过 8271571 个双精度值,我需要算术平均值。
但主要问题是,我似乎不够聪明,无法做到这一点。
目前我只是将它们相加并除以大小。 这在大多数情况下都会失败或溢出,给我 -1.#INF 或 1.#INF。
for(size_t j = 0; j < 12; j++)
{
double a = 0.0;
for(size_t i=0; i < Features->size(); i++)
{
a += Features->at(i)->at(j);
}
meanVector[j] = a / Features->size();
}
但是,不能说它只是正值或负值,所以我不能设置要签名的数据类型。
当我将它们相加时,我也尝试在求和中使用除法常数或除以大小,但这也无济于事。
值的范围,从我快速浏览的结果来看,从 -20 到 +30,但不能肯定地说。
所以也许任何人都可以给我一个关于如何做数学或使用解决方法的提示。这一定可以,但我只是缺乏想法。
编辑:
大小永远不会为0,在划分之前进行检查。 此外,没有任何值以任何方式无效。在提取它们时,我已经检查了#IND 和 NaN。
如果我已经在总和上除,我想这也不是正确的结果?
a+= Features->at(i)->at(j) / Features->size()
结果为 -3.7964983860343639e+305
但对于每次迭代。这不可能是正确的,看起来像一个边界
编辑 2:
所以你们中的一些人是完全正确的。有很多垃圾sh * t发生..
0:大小:8327571,最小值:-2.24712e+307,最大值:3362.12 1:大小:8327571, 最小值:-2.24712e+307,最大值:142181 2:大小:8327571,最小值:-2.24712e+307, 最大值:59537.8 3:大小:8327571,最小值:-2.24712e+307,最大值:236815 4: 大小:8327571,最小值:-2.24712e+307,最大值:353488 5:大小:8327571,最小值: -2.24712e+307,最大值:139960 6:大小:8327571,最小值:0,最大值:0 7:大小:8327571,最小值:0,最大值:0 8:大小:8327571,最小值:0,最大值:0 9:尺寸: 8327571,最小:0,最大:0 10:大小:8327571,最小:0,最大:0 11:大小: 8327571,最小值:0,最大值:0
【问题讨论】:
-
您可以求和
number[i]/n- 但它可能会增加数字错误... -
如果所有
Features->size()都不是0,您确定吗? (提示:任何浮点数除以 0 将得到无穷大 - 如果数字是非负数 -1.#INF,如果是负数 --1.#INF) -
其中一个被求和的值也可能是 +/-INF - 您应该添加一个断言来检查这一点。
-
我根据您的要求编辑了一些信息。
-
看起来即使
max of size_t的值从-20 到30 也不太可能达到double的范围的末尾。我认为你的一个假设是不正确的。