Given a double variable named x that has been declared and given a value, let's use a binary search technique to assign an estimate of its square root to another double variable, root that has also been declared. Let's assume that x's value is greater than 1.0 -- that will simplify things a bit. Here's the general idea: Since x>1, we know its square root must be between 1 and x itself. So declare two other variables of type double (a and b say) and initialize them to 1 and x respectively. So we know the square root must be between a and b. Our strategy is to change a and b and make them closer and closer to each other but alway make sure that the root we're looking for is between them. (Such a condition that must always hold is called an invariant.) To do this we will have a loop that at each step finds the midpoint of a and b. It then squares this midpoint value and if the square of the midpoint is less than x we know that the root of x must be bigger than this midpoint: so we assign the midpoint to a (making a bigger and shrinking our a and b interval by half!)-- and we still can be sure that the root is between a and b. Of course if the midpoint's square is greater than x we do the opposite: we assign b the value of midpoint. But when to stop the loop? In this exercise, just stop when the interval between a and b is less than 0.00001 and assign root the midpoint of a and b then. We call this a binary search also because at each stage we cut the interval under consideration in half. Efficient as this method is, old Isaac Newton discovered an algorithm that is even more efficient and that's what the library function sqrt uses.

.
.
Click on the title for the solution
.
.

This is the answer:

:

const double PRECISION = 0.00001;
double a = 1;
double b,mid;
b=x;

while ((b-a)>PRECISION)
{
    root = (a+b)/2;
    if (root*root < x)
        a = root;
    else
        b=root;
}

Comments

Popular posts from this blog

411: You are given a file named phonedir that consists of many lines containing three strings: lastname firstname emailaddress. Write a utility program that reads commands (from stdin). Each command has one of two possible forms: lookup string add lastname firstname emailaddress In the case of the first command (lookup), the program looks for a line in the phonedir file where either the firstname or lastname matches the string given. If it finds such a line it prints out all three parts of the line, separated by spaces: lastname firstname emailaddress If it does not find a match in the file it prints out the string it was looking for, followed by a colon followed by a space followed by the message "not found": string: not found In the case of the second command (add), the program appends the three strings given to the file phonedir. Hints and suggestions: (1) Define and use two functions named lookup and add. When your program reads the string lookup, your lookup function is called; when the program reads the string add, your add function is called. When either of these two functions are called, they then read whatever else is necessary for their command (one string for lookup and three strings -- lastname, firstname, and emailaddress-- for add). And then these functions do... whatever it takes to carry out the command. (2) When doing a lookup or an add, open up the file phonedir ... carry out the operation .. and then close up the file. EXAMPLE: suppose the phonedir file looked like this: arnow david arnow@panix.com bush george president@whitehouse.gov gates bill bill@microsoft.com here then is a sample session with the program (program output is in bold): lookup david arnow david arnow@panix.com lookup joe joe: not found add theplumber joe joetheplumber@nowhere.com lookup arnow arnow david arnow@panix.com lookup joe theplumber joe joetheplumber@nowhere.com and the phonedir file would now be: arnow david arnow@panix.com bush george president@whitehouse.gov gates bill bill@microsoft.com theplumber joe joetheplumber@nowhere.com

NOTE: in mathematics, division by zero is undefined. So, in C++, division by zero is always an error. Given a int variable named callsReceived and another int variable named operatorsOnCall write the necessary code to read values into callsReceived and operatorsOnCall and print out the number of calls received per operator (integer division with truncation will do). HOWEVER: if any value read in is not valid input, just print the message "INVALID".