我无法绕过这个。
为什么我方形的部分显着缩小?
我知道如果我使用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
答案 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)=5
但sqrt(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} }
*这在理性上是正确的,你必须在实数上添加一些病态案例,但不会影响你的日常生活。