最终结果的平方根距离计算给出了不同的结果

时间:2014-12-17 11:42:51

标签: java math processing

我无法绕过这个。 为什么我方形的部分显着缩小? 我知道如果我使用l += l然后我得到了正确的金额,但它不应该是我相信的那样。

如果我们看处理dist方法:

  static public final float dist(float x1, float y1, float x2, float y2) {
    return sqrt(sq(x2-x1) + sq(y2-y1));
  }

然后在内积上使用平方根。在我的代码中,我使用最终结果执行此操作。

void setup() {

  // normal way, which gives correct result:
  float l = 0;

  l += dist(96.5, 89.0, 420.0, 97.5);
  l += dist(420.0, 97.5, 412.5, 409.5);
  l += dist(412.5, 409.5, 89.0, 420.0);
  l += dist(89.0, 420.0, 96.5, 89.0);

  println(l); // ok
  println(sqrt(sq(l))); // ok

  l = 0;

  l += distSQ(96.5, 89.0, 420.0, 97.5);
  l += distSQ(420.0, 97.5, 412.5, 409.5);
  l += distSQ(412.5, 409.5, 89.0, 420.0);
  l += distSQ(89.0, 420.0, 96.5, 89.0);

  l = sqrt(l);

  println("why is this one smaller? "+l); // should be twice as big

}

static protected final float distSQ(float x1, float y1, float x2, float y2) {
  return sq(x2-x1) + sq(y2-y1);
}

编辑:

输出是:

  

1290.457

     

1290.457

     

为什么这个更小? 645.3716

4 个答案:

答案 0 :(得分:2)

l += dist(96.5, 89.0, 420.0, 97.5);
l += dist(420.0, 97.5, 412.5, 409.5);
...

就像

l = sqrt(a^2+b^2) + sqrt(c^2+d^2)...

但是

l += distSQ(96.5, 89.0, 420.0, 97.5);
l += distSQ(420.0, 97.5, 412.5, 409.5);
l = sqrt(l);

就像

l = sqrt(a^2+b^2+c^2+d^2...)

它们并不等同。以下是sqrt(9)+sqrt(4)=5sqrt(9+4)=3.6

的示例

答案 1 :(得分:1)

如果您认为(a + b + c + d) * (a + b + c + d)等于aa + bb + cc + dd,那么我们应该联合发布!

所以,

 l += distSQ(96.5, 89.0, 420.0, 97.5);
 l += distSQ(420.0, 97.5, 412.5, 409.5);
 l += distSQ(412.5, 409.5, 89.0, 420.0);
 l += distSQ(89.0, 420.0, 96.5, 89.0);
 l = sqrt(l);

的价值截然不同
  l += dist(96.5, 89.0, 420.0, 97.5);
  l += dist(420.0, 97.5, 412.5, 409.5);
  l += dist(412.5, 409.5, 89.0, 420.0);
  l += dist(89.0, 420.0, 96.5, 89.0);

答案 2 :(得分:0)

将括号放在distSQ

的return语句上

答案 3 :(得分:0)

值得一提的是,您对平方根函数sqrt的期望仅适用于线性函数*。

一个函数f,它接受​​一个实数并返回一个实数,验证所有a和b的f(a+b) = f(a)+f(b)(因此你所期望的)必须由常量c定义,以便f(x)=c*x

您可以看到倒数也是如此且易于查看:c*a+c*b = c*(a+b)

在这种情况下,绘制f会产生一条穿过原点的直线(点(0,0)),你知道平方根的情况不是这样:{{3} }


*这在理性上是正确的,你必须在实数上添加一些病态案例,但不会影响你的日常生活。