我正在努力解决求和问题,该问题因不足或溢出而失败。
我有超过 8271571 个 double 值,我需要从中求算术平均值。
但主要问题是,我似乎不够聪明,无法做到这一点。
目前我只是将它们相加并除以大小。 这在大多数情况下都失败或溢出,给我 -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: size: 8327571, min: -2.24712e+307, max: 3362.12 1: size: 8327571, min: -2.24712e+307, max: 142181 2: size: 8327571, min: -2.24712e+307, max: 59537.8 3: size: 8327571, min: -2.24712e+307, max: 236815 4: size: 8327571, min: -2.24712e+307, max: 353488 5: size: 8327571, min: -2.24712e+307, max: 139960 6: size: 8327571, min: 0, max: 0 7: size: 8327571, min: 0, max: 0 8: size: 8327571, min: 0, max: 0 9: size: 8327571, min: 0, max: 0 10: size: 8327571, min: 0, max: 0 11: size: 8327571, min: 0, max: 0
最佳答案
- I have over 8271571 double values from which I need the arithmetical mean.
- Values may range, from what I have seen on a quick look, from -20 to +30, but can't say that for sure.
- The size is never 0, a checkup is done in front of the division.
这并没有加起来。总和应该很容易放入 double
中。数据肯定有问题。您可以像这样快速检查您的值:
for (size_t j = 0; j < 12; ++j)
{
std::vector<double> values;
values.reserve(Features->size());
for (size_t i = 0; i < Features->size(); ++i)
{
values.push_back(Features->at(i)->at(j));
}
// Find extreme values, including infinity
std::cout << j << ": "
<< "size: " << values.size()
<< ", min: " << *std::min_element(values.begin(), values.end())
<< ", max: " << *std::max_element(values.begin(), values.end())
<< std::endl;
// Find NaNs
for (size_t i = 0; i < Features->size(); ++i)
{
// Choose one of the following ifs
// For C++11 (isnan is a standard thing now)
if (std::isnan(Features->at(i)->at(j))
// Or for Visual Studio
if (_isnan(Features->at(i)->at(j))
// Or for GCC prior to C++11
if (__builtin_isnan(Features->at(i)->at(j))
{
std::cout << "NaN at [" << i << ", " << j << "]" << std::endl;
}
}
}
如果输入有任何异常,您应该能够快速发现。
关于c++ - 避免在 "simple Summation"上加倍溢出/溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13051216/