我遇到了一个求和问题,会因为上溢或下溢而失败。
我有超过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:
所以你们中的一些人完全正确。有很多垃圾信息在发生...
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
的总和 - 但这可能会增加数值误差... - amitFeatures->size()
不为0
吗?(提示:任何浮点数除以 0 都会得到无穷大 - 如果这个数是非负的,结果为1.#INF
,如果是负数,则为-1.#INF
) - Kiril Kirovsize_t
值的最大值也不可能达到double
范围的末尾。我认为你的假设有误。 - James Clark