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.000

    Der 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 benutzen

    http://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


Anmelden zum Antworten