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 ändertalso 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 zeichendanke!!
-
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 Functions10.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.