Wurzel



  • hallo, ich hab ein problem mit Wurzelberechnung:

    #include <iostream>
    using namespace std;
    int main();
    float Funktion(float gewuenschte_Zahl)
    {
              float Seite1 = gewuenschte_Zahl;
              float Seite2 = 1;
              int i=0;
              for(;;)
              {          
                        i++;
                   Seite1 = ((Seite1+Seite2)/2);
                   Seite2 = (gewuenschte_Zahl/Seite1);
                   if((Seite1 == Seite2)||(i>90))
                   {
                   cout << Seite1;
                   break;
                   }
              };
    
    }
    
    main()
    {
         Funktion(2); 
         cin.get();
         return 0;
    };
    

    Es rechnet mir zwar die wurzel aus, aber z. B. bei Wurzel aus 2 liefert sie mir den wert: 1.41421
    ich möchte aber mehr stellen hinter dem komma haben... 😕
    wenn ich float mit double austausche, klappts auch nicht.
    Ich habe den DEV-C++, falls es daran liegt 🙂



  • mach doch dein i>90 etwas höher?



  • *wow*
    auf die idee bin ich auch schon gestoßen 😃
    das ist ja eine grenze, dass der pc nicht bis in die unendlichkeit rechnet...(z.B. wurzel aus 2)
    der wert ist irgendwie egal... ich kann von 0 bis 10000 alles eintippen 😞



  • Hab meinen VC++ ausgegraben. mit dem funktionierts auch nicht 😮



  • das ist denke ich ein internes Rundungsproblem, da gleich bei den ersten berechnungen immer gerundet wird. Und mit jeder Berechnung wird weiter gerundet, so dass du nicht genauer werden kannst.

    PS: die Funktion sqrt() aus der math macht es noch ein stückchen genauer

    Mal abwarten was die spezies dazu sagen



  • Probier mal

    cout << setprecision(20) << Seite1;
    

    (Musst noch <iomanip> einbinden)

    btw noch zu deinem code:
    Dass man die main-Funktion deklariert, hab ich noch nie gesehen.
    Deine Funktion gibt keinen Wert zurück, also nicht float sondern void.
    Nach einer for-Schleife und nach der main-Funktion sollte man kein Semikolon setzen.



  • jetzt sind es aber 15 stellen nach dem komma 🙄
    kann man das noch mehr erweitern?

    p.s: zuvor hab ich die funktion mit return kombiniert, desswegen kein void.
    ich versuche meinen code so zu halten, dass er auf allen gängigen compilern läuft. desswegen die "int main();"
    beeinträchtigt ein semikolon hiner einer schleife deren funktion?? 😕



  • Mayor schrieb:

    p.s: zuvor hab ich die funktion mit return kombiniert, desswegen kein void.
    ich versuche meinen code so zu halten, dass er auf allen gängigen compilern läuft. desswegen die "int main();"
    beeinträchtigt ein semikolon hiner einer schleife deren funktion?? 😕

    Ein einfaches Semikolon ist ein leeres Statement. Würde also nach der Schleife ausgeführt. Wenn du einen Rückgabewert definierst, solltest du auch einen zurück geben, ansonsten void nehmen. Unabhängig davon was du zuvor getan hast. Die Forward-Deklaration von main kannste Streichen. Das Programm wird als Einsteigspunkt immer main haben, ob mit oder ohen Forward-Deklaration. Außerdem solltest du unten bei der Implementierung der Funktion auch den return-Wert angeben.



  • -predator- schrieb:

    Probier mal

    cout << setprecision(20) << Seite1;
    

    (Musst noch <iomanip> einbinden)

    mach noch ein fixed dazwischen:

    cout << fixed << setprecision(20) << Seite1;
    

    wenn du fixed wieder weghaben willst: cout << scientific;
    Seite1 wird gerundet (achtung cout << fixed << setprecision(2) << 2.126; rundet zwar auf 2.13 aber cout << fixed << setprecision(2) << 2.125 rundet ab auf 2.12!)



  • ich hab mal einen fall gelesen, bei dem man die wurzel aus 2 mehr als 100 stellen nach dem komma angeben kann. ist das auch so möglich?



  • mit Standard-Gleitkommatypen reicht die Präzision nicht aus - da mußt du dir schon einen eigenen Datentyp definieren, der Zahlen so präzise darstellen kann.



  • gibt es da ein tutorial dafür 😕


Anmelden zum Antworten