У нас есть ситуация, когда мы хотим сделать своего рода средневзвешенное значение двух значений w1 и w2 на основе того, насколько далеко два других значения v1 & v2 отличны от нуля ... например:
- Если v1 равен нулю, он вообще не взвешивается, поэтому мы возвращаем w2.
- Если v2 равен нулю, он вообще не взвешивается, поэтому мы возвращаем w1.
- Если оба значения одинаково далеки от нуля, мы вычисляем среднее значение и возвращаем (w1 + w2) / 2.
Я унаследовал такой код:
float calcWeightedAverage(v1,v2,w1,w2)
{
v1=fabs(v1);
v2=fabs(v2);
return (v1/(v1+v2))*w1 + (v2/(v1+v2)*w2);
}
Для некоторой предыстории, v1 и v2 представляют, как далеко повернуты две разные ручки, вес каждого отдельного результирующего эффекта зависит только от того, насколько они повернуты, а не в каком направлении. em>
Ясно, что это проблема, когда v1==v2==0
, поскольку мы получаем return (0/0)*w1 + (0/0)*w2
, а вы не можете сделать 0/0
. Проведение специального теста для v1==v2==0
с математической точки зрения выглядит ужасно, даже если это неплохая практика с числами с плавающей запятой.
Так что я подумал, если
- была стандартная библиотечная функция для обработки этого
- есть более аккуратное математическое представление
v1==v2==0
программно тоже звучит ужасно - он не будет делать то, что некоторые могут подумать :-) - person Péter Török   schedule 18.09.20100.0
на самом деле математически оправданы, потому что математическая функцияF(x, y) = x / (x + y)
прерывается наx = 0, y = 0
. Таким образом, у вас должен быть особый случай этой точки - в этом случае вы заменяете ее пределом, посколькуx
иy
оба приближаются к 0 (который, к счастью, определен и конечен). - person caf   schedule 18.09.2010x = 0, y = 0
. - person caf   schedule 18.09.2010