1,105,344 Community Members

Square root program without sqrt or pwr

Member Avatar
tformed
Junior Poster in Training
60 posts since May 2007
Reputation Points: 11 [?]
Q&As Helped to Solve: 1 [?]
Skill Endorsements: 0 [?]
 
0
 

is there any way one could do a square root program without sqrt or pwr functions?

Any tips?

I am not asking for code btw.:)

Member Avatar
Narue
Bad Cop
12,139 posts since Sep 2004
Reputation Points: 5,693 [?]
Q&As Helped to Solve: 1,537 [?]
Skill Endorsements: 81 [?]
Team Colleague
 
0
 

>is there any way one could do a square root program without sqrt or pwr functions?
No, those functions are magic. There's no way you can simulate their behavior in C++ without pixie dust or phoenix feathers. One might assume that if you know how the mathematics work, you could come up with a sensible facsimile, but in reality, only compiler writers are capable of creating such things...

Member Avatar
Rashakil Fol
Super Senior Demiposter
2,596 posts since Jun 2005
Reputation Points: 982 [?]
Q&As Helped to Solve: 209 [?]
Skill Endorsements: 42 [?]
Team Colleague
 
0
 

You could use a binary search algorithm. (It would be easy to name better ways, but Meh.)

Member Avatar
Salem
Posting Sage
7,177 posts since Dec 2005
Reputation Points: 5,138 [?]
Q&As Helped to Solve: 970 [?]
Skill Endorsements: 41 [?]
Team Colleague
 
0
 

There seems to be a rash of "do x without using the obvious" problems at the moment.

Are they all at the same school with some dim-wit teacher who thinks that learning dumb tricks is the way to teach programmers.

Member Avatar
tformed
Junior Poster in Training
60 posts since May 2007
Reputation Points: 11 [?]
Q&As Helped to Solve: 1 [?]
Skill Endorsements: 0 [?]
 
0
 

lol, point me out to these threads if you can, just in case i can point them out lol

anyways, the teacher wants us to write a program without relying on these special functions. I can do them with, but now he wants us to do without.

I do not know of any mathematical formula that will enable me to achieve this without using a square root.
I will ask him, to clarify. Will post back later.

There seems to be a rash of "do x without using the obvious" problems at the moment.

Are they all at the same school with some dim-wit teacher who thinks that learning dumb tricks is the way to teach programmers.

Member Avatar
Narue
Bad Cop
12,139 posts since Sep 2004
Reputation Points: 5,693 [?]
Q&As Helped to Solve: 1,537 [?]
Skill Endorsements: 81 [?]
Team Colleague
 
0
 

>anyways, the teacher wants us to write a program without relying on these special functions.
Yea, we figured as much. The thing is, there's no point to it if the functions are available. That's why they're there, so you don't have to write them. Anyway, a simple pow is easy to write: Just multiply x with itself y times and you have [TEX]x^y[/TEX]. sqrt is harder, but you can find examples and explanations all over the web. Most likely you don't care about efficiency for a class, so just pick the first one you find that works. Two relatively simple ones are binary search (like Rashakil suggested) and newton iteration.

Member Avatar
Sturm
Veteran Poster
1,067 posts since Jan 2007
Reputation Points: 270 [?]
Q&As Helped to Solve: 31 [?]
Skill Endorsements: 0 [?]
 
1
 

heres one (I do not know what it is called. My friend and I were having a competition who could make the fastest sqrt algorithm, so this is mine):

double sqrt(double num)
{
    double mod=1;
    double c=0;

    for(int d=0; d<50; c+=mod, d++)
    if(c*c>num)
    {
        c-=mod;
        mod/=10;
    }
    
    return c;
}
Member Avatar
Salem
Posting Sage
7,177 posts since Dec 2005
Reputation Points: 5,138 [?]
Q&As Helped to Solve: 970 [?]
Skill Endorsements: 41 [?]
Team Colleague
 
0
 

Obviously, my coloured in hint wasn't enough ;)

Compare log(10000) with log(100)
Try it with a few others as well where one is the square root of the other.

Member Avatar
~s.o.s~
Failure as a human
10,399 posts since Jun 2006
Reputation Points: 2,496 [?]
Q&As Helped to Solve: 992 [?]
Skill Endorsements: 72 [?]
Administrator
Featured
 
0
 

Different methods of finding the square root.

> Try it with a few others as well where one is the square root of the other.
Yes, logarithmic method seems to be a good choice.

Member Avatar
tformed
Junior Poster in Training
60 posts since May 2007
Reputation Points: 11 [?]
Q&As Helped to Solve: 1 [?]
Skill Endorsements: 0 [?]
 
0
 

I keep on getting the following as an error:

'ln' undefined; assuming extern returning int

do i need to define ln? If so, what value?

Member Avatar
~s.o.s~
Failure as a human
10,399 posts since Jun 2006
Reputation Points: 2,496 [?]
Q&As Helped to Solve: 992 [?]
Skill Endorsements: 72 [?]
Administrator
Featured
 
0
 

There is no function name 'ln' in standard C++. Its the 'log' function which you need to look into. You also need to refer the Math library for completing your task.

Member Avatar
Narue
Bad Cop
12,139 posts since Sep 2004
Reputation Points: 5,693 [?]
Q&As Helped to Solve: 1,537 [?]
Skill Endorsements: 81 [?]
Team Colleague
 
0
 

It's log, not ln. And you can find it in <cmath>.

Member Avatar
Nichito
Posting Virtuoso
1,724 posts since Mar 2007
Reputation Points: 393 [?]
Q&As Helped to Solve: 81 [?]
Skill Endorsements: 4 [?]
Featured
 
0
 

>is there any way one could do a square root program without sqrt or pwr functions?
No, those functions are magic. There's no way you can simulate their behavior in C++ without pixie dust or phoenix feathers. One might assume that if you know how the mathematics work, you could come up with a sensible facsimile, but in reality, only compiler writers are capable of creating such things...

I'm sorry, but i will have to disagree with that, since, a little time ago, one of my teachers asked the same thing, and there's a simple solution just as the one sturm suggested...

int main(){
   int c,n;
   float a,b,d=1;
   printf("Input a number\n");
   scanf("%d",&n);
   c=n-1;
   for (a=0;a<c;a+=d){
      b=a*a;
      if (b==n){
         b=a;
     a=c;
      }else{
     if (b>n){
        a-=d;
        d/=10;
     }
      }
   }printf("The square root of %d is %3.4f\n     Press >>ENTER<< to exit",n,b);
   getchar();
   getchar();
   _exit(0);
   return 0;
}

That will return any exact square root for any whole number... if you want a square root for a number with decimal points, you have to do some modifications... but that's the main idea...

Member Avatar
Terry Robinson
Light Poster
27 posts since Apr 2007
Reputation Points: 0 [?]
Q&As Helped to Solve: 1 [?]
Skill Endorsements: 0 [?]
 
0
 

OK, now that everyone has had a good joke about this - I had to do this years ago using a very primitive BASIC. I can't remember the exact algorithm, but I reasoned that guys like Sir Isaac Newton and his crowd didn't have calculators or even log tables and they did some pretty hairy calculations. So...I looked up the topic in some really old books to see how it was done before we had computers.

The trick is to make a guess, determine your error and then make a new guess based on your error. You may also have to specify a required accuracy range (since you can't get perfect for many numbers using binary math). You make a loop which continually refines your guess based on your last error and exit when the guess is within your required accuracy range. I remember that the code was only a few lines of BASIC and it only needed to loop a few times for even very large numbers.

Anyway, if no one gives you a straight answer by tomorrow I will try to remember just how it went and post here again, but that should be enough for you to figure it out.

Cheers.

Member Avatar
Narue
Bad Cop
12,139 posts since Sep 2004
Reputation Points: 5,693 [?]
Q&As Helped to Solve: 1,537 [?]
Skill Endorsements: 81 [?]
Team Colleague
 
0
 

>I'm sorry, but i will have to disagree with that, since, a little time ago,
>one of my teachers asked the same thing, and there's a simple solution
>just as the one sturm suggested...
Nichito meet sarcasm, sarcasm meet Nichito. I'm sure you'll become good friends. I was rather hoping that what I said was ridiculous enough that intelligent people would realize I was joking.

Member Avatar
Nichito
Posting Virtuoso
1,724 posts since Mar 2007
Reputation Points: 393 [?]
Q&As Helped to Solve: 81 [?]
Skill Endorsements: 4 [?]
Featured
 
0
 

jesus... can't you let me be the hero just for once?? :P

i mean... i knew you couldn't be serious when you said it was impossible... just let me be happy...

Member Avatar
Narue
Bad Cop
12,139 posts since Sep 2004
Reputation Points: 5,693 [?]
Q&As Helped to Solve: 1,537 [?]
Skill Endorsements: 81 [?]
Team Colleague
 
0
 

>jesus... can't you let me be the hero just for once??
I'm always the villain, so you can't be anything but the hero in comparison.

Member Avatar
Nichito
Posting Virtuoso
1,724 posts since Mar 2007
Reputation Points: 393 [?]
Q&As Helped to Solve: 81 [?]
Skill Endorsements: 4 [?]
Featured
 
0
 

hmmm... good to know...

Member Avatar
Nichito
Posting Virtuoso
1,724 posts since Mar 2007
Reputation Points: 393 [?]
Q&As Helped to Solve: 81 [?]
Skill Endorsements: 4 [?]
Featured
 
0
 

The trick is to make a guess, determine your error and then make a new guess based on your error. You may also have to specify a required accuracy range (since you can't get perfect for many numbers using binary math). You make a loop which continually refines your guess based on your last error and exit when the guess is within your required accuracy range. I remember that the code was only a few lines of BASIC and it only needed to loop a few times for even very large numbers.

This is a good method, but it will NEVER return an exact answer...

Member Avatar
tformed
Junior Poster in Training
60 posts since May 2007
Reputation Points: 11 [?]
Q&As Helped to Solve: 1 [?]
Skill Endorsements: 0 [?]
 
0
 

Ok, I got it working by replacing the ln with log. :P

i get some warnings, which I will ignore for the time being. (I have everything defined as float, it tells me that conversion from double to float might lead to loss of value.)

Decimals work also.

I did and else statement where if the number is negative it gets the absolute value and does the program as is and places an "i" behind the result. leading imaginary numbers.

now i am trying to restrict characters, as the program shows a large number when a character is placed.

but the main program itself works, as it does the problem correctly.

I will post the warning later on. I will give it some more tries with the type, but so far as stated before i have everything as float.

Update:
#include <stdio.h>
#include <math.h>

int main(void)
{
float whome, heyyou;


printf("Place number to square root:\n");
scanf_s ("%f",&whome);


if (whome >= 0) {
heyyou= exp((1.0/2.0)*log(whome));
printf ("The square root of the number is: %5.4f\n",heyyou);
}
else
{
heyyou= exp((1.0/2.0)*log(abs(whome)));
printf ("The square root is: %5.4f i\n",heyyou);

}

return 0;
}

my warnings:

1>source.c(18) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data
1>source.c(23) : warning C4244: 'function' : conversion from 'float' to 'int', possible loss of data
1>source.c(23) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data

You
This article has been dead for over three months: Start a new discussion instead
Post:
Start New Discussion
Tags Related to this Article