Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 不使用平方根的两点之间的距离_C_Distance_Points_Square Root - Fatal编程技术网

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

C 不使用平方根的两点之间的距离,c,distance,points,square-root,C,Distance,Points,Square Root,不必使用math.h库就可以计算两点之间的距离吗?我知道,使用math.h库,它必须是以下几行中的某一行(欧几里德距离公式): 但是,有没有一种方法可以做完全相同的事情,但不使用平方根(它需要math.h库) 编辑:每当我尝试以下代码时,它都会给我浮点异常(内核转储): float sqrt(int x){ int i; 浮子; s=((x/2)+x/(x/2))/2;/*第一次猜测*/ 对于网格上的(i=1;i距离计算,通常使用一个涉及平方根计算的公式。实际上,不调用标准C库中的sqrt()函

不必使用math.h库就可以计算两点之间的距离吗?我知道,使用math.h库,它必须是以下几行中的某一行(欧几里德距离公式):

但是,有没有一种方法可以做完全相同的事情,但不使用平方根(它需要math.h库)

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

float sqrt(int x){
int i;
浮子;
s=((x/2)+x/(x/2))/2;/*第一次猜测*/

对于网格上的(i=1;i距离计算,通常使用一个涉及平方根计算的公式。实际上,不调用标准C库中的sqrt()函数而计算平方根的唯一方法是重新实现它,但效果很差


你为什么要这样做?(或者你是在问,“我怎么能不计算平方根就这样做?”这不再是编程问题了。

这应该行得通。试试看

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 sqrt(int x){
int i;
浮子;
s=((x/2)+x/(x/2))/2;/*第一次猜测*/
对于(i=1;i
intsqrt(intx){
int s,t;
s=1;t=x;
而(s>1;//x1=(N/x0+x0)/2:递推公式
}而(s
您可以使用巴比伦法计算平方根。此方法使用逐次近似法计算平方根

下面是它的工作原理

假设您要计算1234的sqrt

设S=1234

D是S中的位数,即=4

如果D是偶数,我们将把它表示为D=2n+2 如果D是奇数D=2n+1,则为else

这里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

看Ma!没有
(但仍需要与libm链接)

#包括
#包括
双距离(双x0、双y0、双x1、双y1){
返回驾驶室((x0+I*y0)-(x1+I*y1));
}
内部主(空){
printf(“==>%7.2f\n”,距离(1,2,2,1));
printf(“==>%7.2f\n”,距离(1,0,4,0));
printf(“==>%7.2f\n”,距离(1,1,4,4));
}

当然有,但基本上是从数学库中复制代码。请注意,
math.h
是一个标题,而不是库,并且数学函数是标准C库的一部分。(很多年前,当系统小得多,内存真的可以用光的时候,数学函数被分解成一个单独的库,如果你不需要的话,可以不链接。)感谢你的准确答案!但是,每当我尝试下面的代码时,它都会给我浮动异常(内核转储):(后期编辑)嗯,我不确定。调试器是否给出了任何提示?使用
x=0
x=1
调用函数将导致在
s=((x/2)+x/(x/2))
中除以0。N、x1和x0来自哪里?当然,
cabs()
将使用
sqrt()
的一些变体实现。。。
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;
}
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;
}
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;
}
#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));
}