6

math.h ライブラリを使用せずに 2 点間の距離を計算することは可能ですか? 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 ライブラリが必要) を使用しませんか?

編集:次のコードを試すたびに、浮動小数点例外 (コア ダンプ) が発生します。

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;
}
4

5 に答える 5

5
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;
}
于 2013-05-03T19:51:08.580 に答える
0

グリッド上の距離計算では、通常、平方根の計算を含む式が使用されます。事実上、標準 C ライブラリの一部である sqrt() 関数を呼び出さずに平方根を計算する唯一の方法は、それを再実装することです。

なぜそれをしたいのですか?(または、「平方根を計算せずにこれを行うにはどうすればよいか」と尋ねていますか? それはもはやプログラミングの問題ではありません。)

于 2013-05-03T19:11:50.217 に答える
0

まー見て!いいえ(ただし、 libm<math.h>とリンクする必要があります)

#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));
}
于 2018-10-11T09:28:14.927 に答える