我有一个c#函数,其中包含计算某些点的欧氏距离的公式。我得到了由R(rx,ry)和L(lx,ly)定义的点的位置。
起初,我尝试编写如下代码:
$classes = ['one', 'two', 'three'];
for (..) {
printf('<li class="%s">', $classes[$key % count($classes)]);
}
它返回0.0。
然后我尝试拆分变量来检查我做错了哪里,如下:
double dRightLeft = Math.Sqrt((Math.Pow(rx - lx, 2) + Math.Pow(ry - ly, 2)));
rl变量返回其操作的有效值。但是当我试图从中取出平方根时,dRighLeft变量仍然返回0.0。 我尝试了这样的已分配和未分配的dRightLeft:
double rl = (Math.Pow(rx - lx, 2) + Math.Pow(ry - ly, 2));
double dRightLeft = Math.Sqrt(rl);
他们两人仍然返回0.0值。
这是我的简短但完整的程序,我获得了rx,ry,lx和ly值:
//assigned
dRightLeft = 0;
//unassigned
dRightLeft;
答案 0 :(得分:0)
我怀疑问题是Math.Pow处理双精度,它具有低精度(see this SO question for more discussion)。直接的本能是通过写出乘法来替换Math.Pow:
double rl = ((rx - lx) * (rx - lx) + (ry - ly) * (ry - ly));
double dRightLeft = Math.Sqrt(rl);
从Math.Pow reference看来,如果你的基数(即rx - lx
或ry - ly
)也是0,那么返回0的唯一方法似乎是指数为2。 / p>