一组浮点数可以高于平均值吗?

lin*_*lof 4 c floating-point

我正在处理的代码基本上归结为:

float child[24];
// assume child[] is filled here with some values
float sum = 0;
float avg;
for (int i = 0; i < 24; i++)
  sum += child[i];
avg = sum / 24;

int n_above_avg = 0;
int n_below_avg = 0;
for (int i = 0; i < 24; i++)
  if (child[i] <= avg)
    n_below_avg++;
  else
    n_above_avg++;
Run Code Online (Sandbox Code Playgroud)

由于浮点不精确,在此代码的末尾是否可能n_below_avg等于0?假设不会发生溢出,并且所有程序员都很好看.

Pas*_*uoq 7

通过avg您使用的计算,技术上可以使浮点数组的所有元素都在上面avg.

实际上,如果所有元素具有相同的值v并导致近似值使得计算avg值相对于数学结果向下舍入v,则阵列中的所有元素都大于avg.

v导致这种行为的那种值是一个值,其位设置为其有效数的最低有效位,因此将值加到自身23次并除以24会导致舍入.如果我必须找到一个,我将逐个枚举浮点数,直到我找到一个这样的值,相信它只需要一秒钟才能找到一个.

存在用于计算浮点数阵列的精确和的技术.一种算法在Python中很有名.使用这些技术,可以计算阵列的正确舍入平均值.如果avg是数组的正确舍入平均值,那么我相信数组中的所有元素都不可能高于它.

  • 发生这种情况的一个这样的值`v`是具有位模式"0x3f800002"(略大于1)的32位浮点数. (2认同)
  • 此外,如果元素的数量非常庞大,则基本上保证在正值的"合理"分布中发生(除非累加器溢出,在这种情况下所有子元素将低于平均值). (2认同)