Gå til innhold

Anbefalte innlegg

Videoannonse
Annonse

Dette programmet regner ut kvadratrot:

 

#include <iostream>
#include <cmath>

using namespace std;

float regn_kvadratrot(float kvadratrot);
int main(int argc, char **argv)
{
 float kvadratrot;
 
       cout<<"Tall: ";
       cin>>kvadratrot;
       float svar;
       svar=regn_kvadratrot(kvadratrot);
       cout<<" = "<<svar<<"\n";
       cin.ignore();
       cin.get();

}

float regn_kvadratrot(float kvadratrot)
{
   float svar;
   svar = sqrt(kvadratrot);

   return svar;
}

Lenke til kommentar

#include <stdio.h>
#include <conio.h>
#include <windows.h>

void clearScreen()
{
// Get the handle to the console which is used for displaying characters
HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);

// Get a handle to the console buffer (the memory which the characters in the console are stored)
CONSOLE_SCREEN_BUFFER_INFO csbi; 
if(!GetConsoleScreenBufferInfo(consoleHandle, &csbi))
 return;

// Get the number of character cells in the current buffer. 
DWORD dwConSize = csbi.dwSize.X * csbi.dwSize.Y;

// Fill the entire screen with blanks (Space Characters).
DWORD cCharsWritten;
COORD coordScreen = { 0, 0 };    // home for the cursor 
if(!FillConsoleOutputCharacter(consoleHandle, (TCHAR) ' ', dwConSize,
coordScreen, &cCharsWritten))
 return;

// Get the current text attribute.
if(!GetConsoleScreenBufferInfo(consoleHandle, &csbi))
 return;

// Set the buffer's attributes accordingly.
if(!FillConsoleOutputAttribute(consoleHandle, csbi.wAttributes, dwConSize,
coordScreen, &cCharsWritten))
 return;

// Put the cursor at its home coordinates.
SetConsoleCursorPosition(consoleHandle, coordScreen);
}



int main()
{
// Set the starting number here
long double startingNumber = 0;

//make the user type in a number
printf("Type in a number to calculate square root from:\n");
scanf("%lg", &startingNumber);

// Make a guess on the result, I choose half the starting number since the
// algorithm is based on averages, it's most likely going to work best if you "Average the number with 0"
long double currentIteration = startingNumber / 2;

// This is used to store what the last guess was
long double last = 0;

while(true)  // Keep running until we're done
{
 // Test to see if the number is the square root of the starting number, if it is, then we're done
 if((currentIteration * currentIteration) == startingNumber) {
 printf("%.20lg is current test for square root of %.20lg\n", currentIteration, startingNumber);
 	break;
 }

 // Divide the starting number by the current guess
 long double quotient = startingNumber / currentIteration;

 // Update the guess to be the average of the old guess and the new guess
 currentIteration = (currentIteration + quotient) / 2;

 // If the current guess is the same as the previous guess, then the guess is no longer changing
 // so there's no need to continue testing
 if(currentIteration == last)
 	break;

 // Store the last value
 last = currentIteration;
}

// Wait for a key press
_getch();

// Clear the screen
clearScreen();

// Wait for another key press
printf("Press any key to exit...");
_getch();

// Exit
return 0;
}

 

Her er den koden jeg bruker for å løse problemet.. Mesteparten går med til en funskjon for å tømme skjermen. :no:

Endret av Tha Phreak
Lenke til kommentar

Den vanlige teknikken for å beregne denne typen verdier på kalkulatorer og datamaskiner er vel å bruke et Taylor-polynom som tilnærmer verdien. Lager man et Taylor-polynom med et høyt nok antall ledd kan man finne ganske eksakte verdier for slike tall uten å utføre mer kompliserte regneoperasjoner enn de helt grunnleggende.

 

Eventuelt kan man lage en rekursiv formel som bruker Newtons metode til å tilnærme verdien. Jeg vet ærlig talt ikke hva som blir enklest.

Endret av Valagar
Lenke til kommentar

Jeg laget en egen funksjon for dette for ikke lenge siden,

jeg pastet koden i en post på forumet.

Søk på kvadratrot eller noe her på C++ forumet så finner du den.

Den går ut på å gjette seg oppover, 1, 2, 3, 4 og når den så kommer til et tall som blir høyere, så legger den på desimaler, 2,1-2,2-2,3 og så hundredeler, 2,31-2,32 osv.

(Dårlig forklart men du skjønner det når du ser koden)

Endret av <BøNilzen>
Lenke til kommentar

#include <iostream>
#include <cmath>

using namespace std;


double const TOLERANCE = 1.0e-7;


double squareRootIter(double n)
{
 double ret = n / 2;
 do ret = (ret + n / ret) / 2;
 while(abs(ret * ret - n) > TOLERANCE);
 return(ret);
} // squareRootIter



double squareRootRec(double n, double guess = 1)
{
 // good enough?
 if(!(abs(guess * guess - n) > TOLERANCE))
   return(guess);

 return(squareRootRec(n, ((n / guess) + guess) / 2));
} // squareRootRec


int main()
{
 double n = 2;
 
 cout << "The square root of " << n << " is " << squareRootIter(n) << endl;
 cout << "The square root of " << n << " is " << squareRootRec(n) << endl;
 
 return(0);
} // main

 

Vet ikke hvor bra dette ble - men ser ut til å fungere.

 

edit:

http://mitpress.mit.edu/sicp/full-text/boo...tml#%_sec_1.1.7

Endret av søppel
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...