Babylonisches Wurzelziehen mit mehreren Nachkommastellen (bin Anfänger)



  • Hallo ihr, ich bin ein ziemlich n00b und wollte vorhin mal ein Programm schreiben, des mir per Iteration näherungen für den Wert einer Quadratwurzel einer beliebigen Zahl ausgibt..ohne math.h zu includen...
    aber des is alles net so wichtig...es scheint nämlich zu funktioneren - was nicht geht ist long oder long double verwenden...würde nämlich gerne mehr Nachkommastellen haben...
    ich habs so probiert - wenn ich anstatt von float long oder long double nehm kommt nur noch mist als zahlenwert raus...
    compiler is visual studio 2003 und ich hab winxp

    #include <stdio.h>
    int main ()
    {
    float  ww,zz; 
    /* ww= wurzelwert - die Zahl die ausgegeben wird 
       zz zugzahl -  die zahl von der die Wurzelgezogen werden soll */
    
    int  s,i=1;
      /*s - anzahl der schritte */
    
    printf("Willkommen beim Wurzelziehen\n");
    printf("Von welcher Zahl willst du die Quadratwurzel ziehen?\n");
    
    scanf("%f",&zz);
    
    printf("\nIn wievielen Schritten?-Je mehr desto genauer!\n");
    
    scanf("%d",&s);
    
    ww=(i+zz/i)/2;
    ++i;
    do /* = Iterationsschleife mit ausgabe der Zwischenwerte*/
    	{ww=(ww+zz/ww)/2;
    	++i;
    
    	printf("%f\n",ww );
    
    }while (i<=s);
    
    printf("\n\n%f",ww);
    
    getchar();getchar();
    
    return 0;
    }
    

    hat jemand ne idee wie ich da die ...waren es max. 19? Stellen herbekommen könnte?

    vielen dank!!!
    and



  • long ist eine ganze Zahl, hat also überhaupt keine Nachkommastellen. Und für double oder long double benötigst du eine andere Formatkennung im scanf:

    scanf("%lf",&zz);//double
    scanf("%Lf",&zz);//long double
    


  • 1. long ist eine ganze Zahl! Damit kannst du kaum Wurzel berechnen.
    2. float ist 32-bit Fliesskomma-Zahl, groesser ist double (64Bit)
    Mit Double hast etwa 16 nachkommastellen. long double ist nicht genauer spezifiziert, es heisst nur (nach ANSI), dass die Bitanzahl(double)<= Bitanzahl(long double) sein muss 😞
    Laut MS-Docu ist unter windows double=long double, insofern sehe ich da keine Chance hoehre genaiugkeit zu bekommen.
    Wenn es dich interessiert schau die das gmp-paket an (http://www.swox.com/gmp)
    Es bietet unendlichlange fliesskommazahlen an. Allergings ist es relativ langsam(wie alle Software-emulationen)



  • danke für die Infos .. 🙂

    scanf("%lf",&zz);//double
    scanf("%Lf",&zz);//long double
    

    ändert auf den ersten blick leider nix ...
    wenn man aber die Ausgabe ändert

    also anstatt von

    printf("%f\n",ww );
    

    z.B.

    printf("%10.16f\n",ww );
    

    und gleichzeitig noch

    scanf("%lf",&zz);//double
    

    einbaut
    dann klappts
    großes L - also long double ändert wirklich nichts...bleibt bei den ca 16 zeichen 🙂

    danke!!



  • hm nochmal ich .. ich hab jetzt nochma geschaut ... so stimmts auch net ....
    wenn man des L bei scanf mit einbaut, muss man am anfang anders deklarieren...mit doubel anstatt von float...
    ABER: ich hab das dumpfe gefühl des es überhaupt nichts ausmach, ob ich float oder double nehme.... hauptsache bei printf steht eben dieses 10.16 oder so was in der art ..
    sehr sonderbar
    weiß jemand warum des auch mit dem normalen float funktioniert??



  • float ist %f
    double ist %lf
    long double ist %Lf
    http://www.dinkumware.com/manuals/reader.aspx?b=c/&h=lib_scan.html#Scan Functions

    10.16 ist nur eine genauigkeitsangabe. normalerweise werden nicht alle stellen angezeigt.
    bei einem float ist es dumm, 16 nachkommastellen zu verlangen, weil floats keine 16 nachkommastellen haben.
    double hat etwa 16 nachkommastellen.



  • ok - d.h. ich muss mich geirrt haben, wenn ich mit float die gleichen 16 nachkommastellen wie mit double hatte... wahrscheinlich war es auch so...
    danke!!



  • Andband schrieb:

    z.B.

    printf("%10.16f\n",ww );
    

    Das %10.16f gibt mir zu denken. Unser Lehrer hat uns beigebracht das die erste Zahl für die Stellen insgesamt sind und die zweite für die Nachkommastellen. Und ich glaub der Punkt muss auch noch zu den Gesamtstellen gerechnet werden. Aber wenn man hier bloss 10 Stellen hat wie will man dann 16 Nachkommastellen anzeigen? Ist das ein Fehler oder hat mir mein Lehrer müll erzählt?

    mfg Alex



  • der lehrer hats richtig erklaert. "10.16" ist aber kein fehler, sondern nur sinnfrei.


Anmelden zum Antworten