We have a situation we want to do a sort of weighted average of two values w1 & w2, based on how far two other values v1 & v2 are away from zero... for example:
- If v1 is zero, it doesn't get weighted at all so we return w2
- If v2 is zero, it doesn't get weighted at all so we return w1
- If both values are equally far from zero, we do a mean average and return (w1 + w2 )/2
I've inherited code like:
float calcWeightedAverage(v1,v2,w1,w2)
{
v1=fabs(v1);
v2=fabs(v2);
return (v1/(v1+v2))*w1 + (v2/(v1+v2)*w2);
}
For a bit of background, v1 & v2 represent how far two different knobs are turned, the weighting of their individual resultant effects only depends how much they are turned, not in which direction.
Clearly, this has a problem when v1==v2==0
, since we end up with return (0/0)*w1 + (0/0)*w2
and you can't do 0/0
. Putting a special test in for v1==v2==0
sounds horrible mathematically, even if it wasn't bad practice with floating-point numbers.
So I wondered if
- there was a standard library function to handle this
- there's a neater mathematical representation