Gå til innhold

Problemer med kvadratrot-funksjon


Anbefalte innlegg

Skrevet

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

Videoannonse
Annonse
Skrevet

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.

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

Skrevet

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

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