Vann: kr.15 Skrevet 21. oktober 2004 Del Skrevet 21. oktober 2004 Heisann!! jeg driver nå å prøver å finne et program som regner ut kvadratrot.. Er det noen som vet hvordan og vil si meg det..? Trenger ikke dette programmet veldig, men er så sinnsykt nyskjerrig på hvordan f.eks windows-kalkulatoren regner ut kvadratrot? Lenke til kommentar
synsing Skrevet 21. oktober 2004 Del Skrevet 21. oktober 2004 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
Vann: kr.15 Skrevet 21. oktober 2004 Forfatter Del Skrevet 21. oktober 2004 hmm... fant ut at jeg ikke vil bruke cmath.. er det noen annen måte å gjøre det på, og i såfall hvordan gjør jeg det? Lenke til kommentar
synsing Skrevet 21. oktober 2004 Del Skrevet 21. oktober 2004 Vil du ikke bruke <cmath> ? Du kan jo bruke <math.h> ... Lenke til kommentar
Herr_Dude Skrevet 21. oktober 2004 Del Skrevet 21. oktober 2004 Denne karen har en samling av algoritmer for utregning av kvadratrot: http://www.dattalo.com/technical/theory/sqrt.html Lenke til kommentar
Vann: kr.15 Skrevet 21. oktober 2004 Forfatter Del Skrevet 21. oktober 2004 (endret) #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. Endret 21. oktober 2004 av Tha Phreak Lenke til kommentar
Valagar Skrevet 21. oktober 2004 Del Skrevet 21. oktober 2004 (endret) 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 21. oktober 2004 av Valagar Lenke til kommentar
Vann: kr.15 Skrevet 22. oktober 2004 Forfatter Del Skrevet 22. oktober 2004 Jeg tror det er newtons metode som er brukt i programmet mitt.. Er ikke sikker da.. Lenke til kommentar
<BøNilzen> Skrevet 22. oktober 2004 Del Skrevet 22. oktober 2004 (endret) 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 22. oktober 2004 av <BøNilzen> Lenke til kommentar
søppel Skrevet 23. oktober 2004 Del Skrevet 23. oktober 2004 (endret) #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 23. oktober 2004 av søppel Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå