Reputation: 105
Is it possible to calculate the distance between two points without having to use the math.h library? I know that, using the math.h library, it would have to be something among these lines (Euclidean distance formula):
int Distance(int x1, int y1, int x2, int y2)
{
int dx = x2 - x1;
int dy = y2 - y1;
return sqrt(dx*dx + dy*dy);
}
However, is there a way of doing this exact same thing but without using the square root (which needs the math.h library)?
EDIT: Whenever I try the following code, it gives me Floating Point Exception (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;
}
Upvotes: 7
Views: 19946
Reputation: 108988
Look Ma! No <math.h>
(but still needs to link with 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));
}
Upvotes: 0
Reputation: 40145
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;
}
Upvotes: 5
Reputation: 166
You can use Babylonian methods to calculate square root. This method uses successive approximations to calculate square root.
Here is how it works
Let's say you want to calculate sqrt of 1234.
Let S = 1234,
D is number of digits in S which is = 4.
If D is even we will represent it as D = 2n+2 else if D is odd D = 2n + 1;
Here D is even so 4 = 2*1+2, so n=1.
Approx squere root of Sapprox = D * 10^n = 4 * 10^1 = 40
Let's call this X0 = Sapprox = 40.
X0 is 0th approximation.
Since S has 4 digits you will have to calculate 3 more approximations and X3 will be correct square root of S.
so
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
Upvotes: 1
Reputation: 10994
This should work. Try it out.
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;
}
Upvotes: 1
Reputation: 5029
distance calculations on a grid generally use a formula that involves the calculation of square roots. Effectively, the only way to calculate square roots without calling the sqrt() function that is part of the standard C library, is to reimplement it, poorly.
Why do you want to do that? (Or are you asking, "how can I do this without calculating square roots"? That's not a programming problem anymore.)
Upvotes: 0