Gå til innhold

Problemer med kvadratrot-funksjon


Anbefalte innlegg

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
Videoannonse
Annonse

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
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

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

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...