<BøNilzen> Skrevet 4. oktober 2004 Del Skrevet 4. oktober 2004 Har laget et program som regner ut kvadratroten av et tall uten å bruke <cmath> biblioteket. (Vet at det ikke er noe vits, men det var bare for å se om jeg fikk det til). Ved mindre tall, på en 3-4 siffer, uten desimaler går det fint, og den gir et ganske fint tall til svar. (Av og til et avvik på 10^-5 eller mindre i forhold til kalkulatoren men, det er fordi jeg har gitt "tillatelse" til dette) Men skriver jeg inn større tall, men ikke minst hvis det har mange desimaler, looper den i evigheter.... Noen som kan se feilen? #include <iostream> #include <iomanip> #include <ctime> float squareRoot(float); //Alternative function to the "sqrt()" float rise(int, int); //Alternative function to the "pow()" bool numberIsI = false; //Boolean variable where 0 means real number and 1 means i-number int main() //Main function { float theSquare = 0; //Float variable theSquare std::cout << "Enter a number : "; std::cin >> theSquare; //Inputs a number to use in squareRoot-function std::cout << std::endl << "The squareroot of " << theSquare << " is +/-" << std::fixed << std::setw(10) << squareRoot(theSquare); //Calls squareRoot-function and prints answer std::cout << ((numberIsI == false) ? "\n" : "i\n"); system("pause"); return 0; //Exited succesfully } float squareRoot(float theNumber) { if(theNumber>=0) numberIsI = false; else if(theNumber <0) { numberIsI = true; theNumber -= 2*theNumber; } bool done = false; //Boolean variable to control while-loop int x = 0; float answer = 0; float theMult; // Multiplicator int theExp = 0; int count = 0; while(done!=true) { theMult = rise(10, theExp); if((answer+x*theMult) * (answer+x*theMult) >= theNumber -0.000001 && (answer+x*theMult) * (answer+x*theMult) <= theNumber +0.000001 || (answer+x*theMult) * (answer+x*theMult) == theNumber) { answer += x*theMult; done = true; } else if((answer+x*theMult) * (answer+x*theMult) > theNumber) { answer += (x-1)*theMult; theExp--; x=1; } else if((answer+x*theMult) * (answer+x*theMult) < theNumber) x++; count++; } return answer; } float rise(int grNumber, int exp) { float answer = grNumber; int x; if(exp > 0) for(x=2; x <= exp; x++) answer *= grNumber; else if(exp==0) answer = 1; else if(exp<0) for(x=0; x >=exp; x--) answer = answer/grNumber; return answer; } Lenke til kommentar
Steinbitglis Skrevet 6. oktober 2004 Del Skrevet 6. oktober 2004 Forstod ikke alle funksjonene fullt ut (og det er kanskje et poeng i seg selv), men jeg fant bare et sted programmet kan loope evig. while(done!=true) linje 37 legg inn noen setninger med cout inni der så ser du hva som foregår evt også en system("pause"); for hver loop. Hvis alt ser greit ut da er det bare jeg som blingsa. Lenke til kommentar
<BøNilzen> Skrevet 6. oktober 2004 Forfatter Del Skrevet 6. oktober 2004 Forstod ikke alle funksjonene fullt ut (og det er kanskje et poeng i seg selv), men jeg fant bare et sted programmet kan loope evig. while(done!=true) linje 37 Poenger er at bool-variabelen "done" blir "true" når jeg den har funnet kvadratroten, eller et tall som er kvadratroten +/- 0.00001 eller hva det var. (Dette fordi jeg ikke ser vitsen med å ta med evig med desimaler) Men selvfølgelig, grunnen er jo at done aldrig blir sann, men jeg skjønner ikke hvorfor. Lenke til kommentar
iobas Skrevet 6. oktober 2004 Del Skrevet 6. oktober 2004 floating point har ikke en presis oppløsning. dvs float f = 0.1 er IKKE 0.1, men det er en meget god tilnærming av 0.1 derfor når du får større tall og flere desimaler blir det vanskeligere å tilnærme svaret ditt. jeg tipper det er det som er feilen. etterhvert som den får en mer upresis tilnærming feiler if-testen din og done blir aldri sann. du kan prøve å bruke double siden den har høyere oppløsning, men det blir litt tregere. eller så burde du finne en annen måte å regne ut kvadratroten på. her kan du lese om hvordan floating point fungerer http://stevehollasch.com/cgindex/coding/ieeefloat.html 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å