【发布时间】:2010-09-17 22:19:03
【问题描述】:
我们有一种情况,我们想要对两个值 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 表示两个不同的旋钮转动了多远,它们各自产生的效果的权重仅取决于它们转动了 多少,而不是朝哪个方向转动.
很明显,当v1==v2==0 出现问题时,因为我们以return (0/0)*w1 + (0/0)*w2 结尾,而您不能这样做 0/0。对 v1==v2==0 进行特殊测试在数学上听起来很糟糕,即使浮点数的做法也不错。
所以我想知道
- 有一个标准库函数来处理这个问题
- 有更简洁的数学表示
【问题讨论】:
-
v1==v2==0在编程上听起来也很糟糕 - 它不会做一些人可能认为它应该做的事情:-) -
这不是代码,而是两者都为零的逻辑条件。很抱歉造成混乱...
-
@John,这就是我的假设 - 只是忍不住发表评论 :-)
-
@John:
0.0的测试实际上在数学上是可辩护的,因为数学函数F(x, y) = x / (x + y)在x = 0, y = 0是不连续的。因此,您必须对这一点进行特殊处理 - 在这种情况下,您将用极限替换它,因为x和y都接近 0(幸运的是,它是已定义且有限的)。 -
@caf: (x,y) 沿轨迹 (r,r) 接近 (0,0) 时的极限,r 接近 0。这个路径极限存在,但在 (0, 0) 不可移动。
标签: c++ c math floating-point divide-by-zero