Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Wurzelberechnung

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
19.10.2005, 12:27 Uhr
Abwesend



Hi,

Ich muss bei meinem Studium seit einiger zeit ( 3 Wochen ) C lernen. Jetzt haben wir eine Aufgabe zur berechnung der Wurzel eine Zahl.
Damit ihr versteht was ich meine schreibe ich mal die Aufgabe:

Aufgabe: Wurzel einer Positiven reellen Zahl x unter ausschließlicher Verwendung der Grundrechenarten, Schreibe ein C Programm zur Wurzelberechnung und vergleichen sie das Ergebniss mit der Wurzelfunktion "sqrt" aus der Mathematischen Bibliothek.

Zur Erinnerung: Xo=Startwert Xn+1= (Xn + (x/Xn)) / 2 , n= 1, 2, 3, ...

Ich hab auch schon ein Programm gemacht, jedoch rechnet er es nicht fertig:


C++:
#include <stdio.h>
#include <math.h>

main()
{
      double x;            /* Eingabe Berechnung*/
      double x1;        /* Schätzwert */
      double xneu;         /* Neuer Schätzwert */
      double y;         /* Wurtzel x */
      double nan=0;        /* Nullwert */
      
      printf("Hier können sie die Wurzel einer positiven reellen Zahl berechnen \n");
      printf("Bitte geben sie die Zahl ein, die sie berechnen wollen \n");
      
      
      while(scanf("%lf", &x) !=EOF)
      {
                         if (x<0)
                         {
                                  printf(" Berechnung nicht moeglich, keine positve reelle Zahl! \n");
                                  }
                        
                         else if (x==0)
                         {
                                  printf("Das Ergebnis ist: %lf \n", nan);
                         }
                         else if (x>0)
                         {
                                   printf("Bitte geben sie einen Schaetzwert ein\n");
                              
                                   scanf("%lf", &x1);
                                  
                                  
                                   y=sqrt(x);                                  
                                   if (x1==y)
                                   {
                                                       printf(" Bingo, das Ergebnis ist: %lf \n", y);
                                   }
                                  
                                  
                                   if (x1!=y)
                                   {
                                      xneu= 0.5*(x1 + ( x/x1 ));
                                      x1=xneu;
                                   }
                                  
                                  
                         }
                        
      }
}  
                                  
                                  
                              




Kann dort jemad einen fehler sehen?

Dieser Post wurde am 19.10.2005 um 12:28 Uhr von Abwesend editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.10.2005, 13:09 Uhr
ao

(Operator)


Wenn du mit "rechnet nicht fertig" meinst "kommt nicht zum Ende", dafür gibts zwei Gründe:

1. Du fragst bei jedem Schleifendurchlauf einen neuen Wert für das Quadrat und einen neuen Startwert ab. Du musst diese Werte *einmal* erfragen und dann das Programm rechnen lassen. Die Formel ist eine allmählich approximierende Folge, die Abbildung auf ein Programm wäre eine Schleife, die so lange wiederholt wird, bis das Ergebnis nahe genug liegt. Dein Programm approximiert aber nicht, sondern testet einmal auf Volltreffer.

2. Du vergleichst den Näherungswert mit dem Ergebnis von sqrt(x) auf exakte Gleichheit, das funktioniert mit Gleitkommatypen nicht. Bei float und double musst du immer auf ein "ungefähr gleich" prüfen, also fabs (a - b) <= irgendeine Schranke (bzw. > Schranke, wenn es als Bedingung für die Wiederholung der Schleife genommen wird)

Also, grobe Struktur ungefähr so, machen musst du es selber:


Code:

Zu radizierende Zahl (y) abfragen

Startwert für Approximation (x) abfragen

Startwert quadrieren und Abweichung zu y berechnen

while (Abweichung > Schranke)
{
    x = .... /* neues x aus y und altem x berechnen */

   Neue Abweichung berechnen

   um den Verlauf zu sehen, kannst du hier x und die Abweichung ausgeben.
}

Ergebnis ausgeben und vergleichen mit sqrt (y)




ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.10.2005, 17:22 Uhr
deKeep



Da es auch ohne Wurzel geht, mach es Dir einfach:

while (x1 !=xneu)
{
xneu= 0.5*(x1 + ( x/x1 ));
x1=xneu;
}

Und denk daran, dass Du am Anfang die Eingabe überprüfst, die Zahl MUSS größer als null sein. Das geht am besten auch in einer while-Schleife, so lange halt, bis eine vernünftige Eingabe erfolgt ist.

Am Ende sind sowohl xneu als auch x1 die wurzel aus x. (aber hier muss man auch aufpassen, denn es kann zu ungenauigkeiten kommen, wenn die letzte Ziffer nicht mehr genau aufgeht. Kannst ja mal testen, wenn das der Fall sein sollte, musst Du halt die Genauigkeit runter setzen, also mit mehr Stellen rechnen, aber weniger ausgeben.

Du kannst aber auch einfach die Durchgänge zählen und sagen, dass zb naach 100 Berechnungen sich nichts meehr ändern wird:

int j = 0;
while (x1 !=xneu || j <100)
{
xneu= 0.5*(x1 + ( x/x1 ));
x1=xneu;
j++;
}

Ich hoffe das bringt Dich weiter!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: