是否可以在不使用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;
}
答案 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));
}