Anzeige:
Ergebnis 1 bis 3 von 3

Thema: Wurzel berechnen

  1. #1
    Registrierter Benutzer
    Registriert seit
    25.11.2002
    Beiträge
    61

    Wurzel berechnen

    Code:
    void main(void)  {
    double x;
    double wurzel;
    
    printf("Bitte Zahl eingeben:\n>>");
    scanf("%lf",&x);
    
    wurzel=x/2;
    while((wurzel*wurzel)!=x)  {
          if ((wurzel*wurzel)>x)
              wurzel=wurzel-0.1;
          if ((wurzel*wurzel)<x)
              wurzel=wurzel+0.1;
    }
    Kann mir jemand sagen warum die while schleife nicht abgebrochen wird?
    Fuer x gebe ich 9 ein.Dann muesste bei wurzel=3 abgebrochen werden oder?

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Durch die beschränkte Auflösung bei Fließkomma Zahlen macht ein Vergleich auch Gleicheit oder Ungleicheit meistens keinen Sinn, weil der Wert eben nicht extakt sein muss.

    Du kannst überprüfen, ob der Absolutbetrag der Differenz der beiden zu vergleichenden Zahlen kleiner als eine gewissen Schelle ist.

    Also in etwa

    Code:
    if (fabs((wurzel*wurzel) - x) < 1e-10)
    Übrigens muss es nach dem C Standard
    Code:
    int main(void)
    heissen

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer
    Registriert seit
    07.03.2001
    Ort
    FStone,D
    Beiträge
    186

    hmm,

    so hab ich das mal gemacht
    Code:
    #include <iostream>
    using namespace std;
    
    
    const double epsilon = 1e-5;
    
    bool isEqual(double a, double b)
    {
       return abs(a - b) < epsilon;
    }
    
    double sqrt(double habenwill)
    {
    	    int counter = 0;
    		double spanne = habenwill;
    		double grenze = spanne/2;
    		double istes  = spanne*spanne;
    		while (!isEqual(istes,habenwill))
    		{
    			if (istes < habenwill)
    			{
    				spanne = spanne + grenze;
    			}
    			else 
    			{
    				spanne = spanne - grenze;
    				grenze /= 2;
    			}
    			counter++;
    			istes = spanne*spanne;
    			cout << spanne << " * " << spanne << " = " << istes << "              " << counter << endl;
    		}
    		return spanne;
    }
    
    int main (void)
    {
    	double suche;
    	cin >> suche;
    	cout << endl << sqrt(suche) << endl;
    	return 0;
    }
    wie schon gesagt wurde, Fliesskommazahlen musste auf eine bestimmte länge 'beschneiden' sonst funzt es nicht.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •