Heronverfahren
-
// Defines #ifdef HAVE_CONFIG_H #include <config.h> #endif // Includes #include <iostream.h> #include <stdio.h> #include <stdlib.h> int main(int arg, char *argv[]) { // Private float x, y, z, c, s, buffer=0.0; int l=1; // Überschirft printf("<- Heron ->\n\n"); // Überprüfung der Argument if(arg!=2){ printf("use: heron [digit]\nexample: sqr 4\n") ; return 0; } x=atof(argv[1]); y=1; s=x; z=(z+y)/2; // Schleife while((int)(z*z*1000000)!=(int)(s*1000000)){ c=z; y=x/c; z=(c+y)/2; l++; printf("loop# %d => %f\n", l-1, z); if(z==buffer) break; buffer=z; } // Ausgabe printf("\nsqr(%f) = %f\nloops: %d\n", s, z, l-1); // Beenden return 0; }
wieso funktioniert der Code nicht bei großen Zahlen wie 40000??
cu para
-
Hi,
while((int)(z*z*1000000)!=(int)(s*1000000))
Hier castest du das Ergebnis von s * 1000000 in ein int. Wenn s
40.000 ist bekommst du als Ergebnis 40.000 * 1.000.000 = 40.000.000.000Der Wertebereich von einem int geht aber nur von -2.147.483.648L bis
2.147.483.647L. Somit kommt es zu einem Ueberlauf.Warum belaesst du es nicht bei float?
mfg
v R
-
Ich verschieb das mal in das ISO C Forum, da es kein Unix spezifisches Problem ist.
Wenn du unbedingt in einen nicht fließpunkt Typ Casten willst, dann caste am besten nach long long oder long int.
BTW.
den iostream Header brauchst du zwar nicht, aber selbst wenn, ist iostream.h veraltet und du solltest die neueren vom ISO C++ Standard beschlossenen Header benutzenhttp://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=iostream#Answ
-
"du solltest die neueren vom ISO C++ Standard beschlossenen Header benutzen"
Er soll für ASNI C den C++ Standard benutzen???
wie stellst du dir das vor!?kannst ja mal ne *.c datei <iostream> inkludieren und versuchen zu uebersetzen
-
Er soll für ASNI C den C++ Standard benutzen???
wie stellst du dir das vor!?kannst ja mal ne *.c datei <iostream> inkludieren und versuchen zu uebersetzen
Liess dir kings Satz nochmal durch
mfg
v R