不使用平方根的两点之间的距离

时间:2013-05-03 19:03:25

标签: c distance points square-root

是否可以在不使用math.h库的情况下计算两点之间的距离?我知道,使用math.h库,它必须是这些行之间的东西(欧几里德距离公式):

int Distance(int x1, int y1, int x2, int y2)

    {
    int dx = x2 - x1;
    int dy = y2 - y1;
    return sqrt(dx*dx + dy*dy);
    }

但是,有没有办法完成同样的事情,但不使用平方根(需要math.h库)?

编辑:每当我尝试以下代码时,它都会给我浮点异常(Core Dumped):

float sqrt(int x) {
        int i;
        float s;
        s=((x/2)+x/(x/2)) / 2; /*first guess*/
        for(i=1;i<=4;i++) { /*average of guesses*/
            s=(s+x/s)/2;
        }
        return s;
    }

float Distance(float x1, float y1, float x2, float y2) {
    float dx = x2 - x1;
    float dy = y2 - y1;
    return sqrt(dx*dx + dy*dy);
}

int main() {
  printf("%f", Distance(1, 2, 2, 1));
  return 0;
}

5 个答案:

答案 0 :(得分:3)

int int_sqrt(int x){
    int s, t;

    s = 1;  t = x;
    while (s < t) {
        s <<= 1;
        t >>= 1;
    }//decide the value of the first tentative

    do {
        t = s;
        s = (x / s + s) >> 1;//x1=(N / x0 + x0)/2 : recurrence formula
    } while (s < t);

    return t;
}

答案 1 :(得分:0)

网格上的距离​​计算通常使用涉及平方根计算的公式。实际上,在不调用属于标准C库的sqrt()函数的情况下计算平方根的唯一方法是重新实现它,不好。

你为什么要这样做? (或者你在问,“我怎么能在不计算平方根的情况下做到这一点?”这不再是一个编程问题了。)

答案 2 :(得分:0)

这应该有效。尝试一下。

float sqrt(int x) {
    int i;
    float s;
    s=((x/2)+x/(x/2)) / 2; /*first guess*/
    for(i=1;i<=4;i++) { /*average of guesses*/
        s=(s+x/s)/2;
    }
    return s;
}

答案 3 :(得分:0)

您可以使用巴比伦方法计算平方根。此方法使用逐次逼近来计算平方根。

以下是它的工作原理

假设您想要计算1234的sqrt。

设S = 1234,

D是S中的位数= 4。

如果D是偶数,我们将其表示为D = 2n + 2 否则如果D是奇数D = 2n + 1;

这里D甚至是4 = 2 * 1 + 2,所以n = 1。

Sapprox的近似根= D * 10 ^ n = 4 * 10 ^ 1 = 40

我们称之为X0 = Sapprox = 40。

X0是第0个近似值。

由于S有4位数,你必须再计算3个近似值,而X3将是 纠正S的平方根。

所以 X1 = 0.5(X0 + S / X0);
 X1 = 0.5(40 + 1234/40)= 35.425

X2 = 0.5(X1 + S / X1);  X2 = 0.5(35.42 + 1234 / 35.42)= 35.129

X3 = 0.5(X2 + S / X2);  X3 = 0.5(35.129 + 1234 / 35.129)= 35.128

sqrt(1234)= 35.128

答案 4 :(得分:0)

看妈!没有<math.h>(但仍需要与 libm 链接)

#include <complex.h>
#include <stdio.h>

double distance(double x0, double y0, double x1, double y1) {
    return cabs((x0 + I*y0) - (x1 + I*y1));
}

int main(void) {
    printf("==> %7.2f\n", distance(1, 2, 2, 1));
    printf("==> %7.2f\n", distance(1, 0, 4, 0));
    printf("==> %7.2f\n", distance(1, 1, 4, 4));
}