我正在处理的代码基本上归结为:
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?假设不会发生溢出,并且所有程序员都很好看.
通过avg您使用的计算,技术上可以使浮点数组的所有元素都在上面avg.
实际上,如果所有元素具有相同的值v并导致近似值使得计算avg值相对于数学结果向下舍入v,则阵列中的所有元素都大于avg.
v导致这种行为的那种值是一个值,其位设置为其有效数的最低有效位,因此将值加到自身23次并除以24会导致舍入.如果我必须找到一个,我将逐个枚举浮点数,直到我找到一个这样的值,相信它只需要一秒钟才能找到一个.
存在用于计算浮点数阵列的精确和的技术.一种算法在Python中很有名.使用这些技术,可以计算阵列的正确舍入平均值.如果avg是数组的正确舍入平均值,那么我相信数组中的所有元素都不可能高于它.