| re: function without arithematic operator
"Anonymous 7843" <anon7843@example.com> wrote in message
news:uhPHe.27079$HV1.5748@fed1read07...[color=blue]
> In article <1122991677.514736.32910@z14g2000cwz.googlegroups. com>,
> <rahul8143@gmail.com> wrote:[color=green]
> >
> >
> > hello,
> > Is it possible to write a math library function sqrt in C without
> > arithmatic operators(*,+)?
> > can anyone give me hints to do that?
> > regards,
> > rahul[/color]
>
> If it's in the math library it doesn't have to be implemented
> in C, so if the processor has a sqrt instruction you can just
> use that. That's cheating (kind of) because it's likely that the
> processor itself will do operations similar to * and + in order
> to execute.
>
> exp(log(x)/2.0) is workable, but divide is an arithmetic
> operator, and although you didn't specifically mention it in
> your list and I can't tell from your words whether the list
> is meant to be exhaustive or to exemplify. Again, exp and
> log are likely to do some arithmetic operations behind
> the scenes.
>
> It's _probably_ possible to use shifts and bitwise operations
> to implement an integer sqrt function. Another integer-only
> solution would be something really lame like:
>
> int sqrt(int x)
> {
> if (x < 4) return 1;
> if (x < 9) return 2;
> if (x < 16) return 3;
> if (x < 25) return 4;
> if (x < 36) return 5;
> /* and so on, up to sqrt(INT_MAX) */
> }
>
> But perhaps you have handed in your homework by now and nothing
> I have said is helpful.[/color]
The code below uses an iterative algorithm to calculate the sqrt of a
double, without any addition or multiplication operations (although
subtraction and division are both used). Comments are welcome.
#include <stdio.h>
#include <stdlib.h>
#define FLIP_SGN(x) -x
double my_abs(double x) {
if(x<0)
return FLIP_SGN(x);
else
return x;
} /* my_abs */
double my_sqrt(double x) {
double ans=0, guess=x, error=1e-12, error2;
int count=0;
error2 = my_abs(ans-guess);
while(error2>error){
ans = (guess-x/FLIP_SGN(guess)) / 2.0; /* Newton's method approximation
*/
error2 = my_abs(ans-guess);
guess = ans;
count--;
} /* while */
printf("Calculated in %d iterations\n", FLIP_SGN(count));
return ans;
} /* my_sqrt */
int main(int argc, char **argv) {
int imag=0;
char *str_test;
double x, ans;
if(argc>1) {
x = strtod(argv[1], &str_test);
if(argv[1]!=str_test) {
if(x<0) {
imag = 1;
x = FLIP_SGN(x);
} /* if */
ans = my_sqrt(x);
if(imag)
printf("sqrt(%f) = %.10fi\n", FLIP_SGN(x), ans);
else
printf("sqrt(%f) = %.10f\n", x, ans);
} /* if */
else
printf("ERROR: Improper input provided; exiting!\n");
} /* if */
else
printf("ERROR: No input provided; exiting!\n");
return 0;
} /* main */
[color=blue]
>gcc -Wall -ansi -pedantic -lm -o my_sqrt my_sqrt.c
>my_sqrt -45.9314[/color]
Calculated in 8 iterations
sqrt(-45.931400) = 6.7772708371i
-Charles |