n-te wurzel



  • Hallo zusammen
    habe ein problem...unzwar hab ich folgendes programm geschrieben um die n-te wurzel aus einer vorgegebenen Zahl a unter der Verwendung des Iterationsverfahrens zu ziehen.

    #include <stdio.h>
    #include <math.h>
    #include <conio.h>

    int main()
    {
    int n, a, potenz, i, zaehl = 0;
    float x1 = 1, x2 = 0, absdiff, genau = 0.00000001f;
    float x_n;

    printf("Wert fuer n: ");
    scanf("%i", &n);
    printf("Wert fuer a: ");
    scanf("%i", &a);

    do
    {
    x_n = pow(x1, (float)n - 1.0f);
    x2 = (1.0f / n) * ((n - 1.0f) * x1 + a / x_n);
    absdiff = x1 - x2;
    x1 = x2;
    zaehl++;
    } while (abs(absdiff) > genau);

    printf("x1 = %f \n", x1);
    printf("zaehl = %d \n", zaehl);
    }

    nun gibt es folgendes problem un zwar komm ich bei 3ter wurzel aus 8 nicht auf 2 sondern auf 2,46222 und zaehl 2.
    warum komme ich nicht auf glatt 2 ???

    MfG



  • Ist denn dein Startwert gut?



  • wie meinst du das.
    bin nicht allzu gut in programmierung.
    hab auch sehr sehr lange an dem programm gesessen.
    versteh nicht ganz was du mit startwert meinst.
    (hab es auch nich ganz allein geschrieben)



  • ^^frag mal die forensuche. mit der aufgabe hat sich letzten erst einer tierisch einen abgebrochen.
    🙂



  • Ich habe deinen Fehler gefunden. Die Funktion abs erwartet einen int als Parameter und es wird entsprechend implizit gecastet. Was du brauchst ist fabs.



  • Wow haut echt hin...dank dir..hätte ich wahrscheinlich nie gefunden



  • ginge nicht einfach

    double wurzel(double x, double n)
    {
      return pow(x, 1/n);
    }
    

    ?



  • pixartist schrieb:

    ginge nicht einfach...

    ginge vielleicht, aber er soll ja irgendso'n näherungsverfahren programmieren.
    🙂



  • knivil schrieb:

    Ich habe deinen Fehler gefunden. Die Funktion abs erwartet einen int als Parameter und es wird entsprechend implizit gecastet. Was du brauchst ist fabs.

    Jo, das ist teuflisch, weil das stillschweigend passiert.
    Übrigens muss es eigentlich bei float fabsf() heissen, weil sonst wieder implizit nach double gecastet wird. :p

    ;fricky schrieb:

    ginge vielleicht, aber er soll ja irgendso'n näherungsverfahren programmieren. 🙂

    Ist aber eigentlich Unfug, wenn eh' schon pow() im Code steht, weil's das direkt kann. Üblicherweise bezieht sich so eine Aufgabenstellung auf skalierte Integer, so sieht das eher witzlos aus.

    Aber geht mich ja nix an ...



  • im übrigen kann ich dir ans herz legen statt float gleich immer double zu nutzen 😉



  • pixartist schrieb:

    im übrigen kann ich dir ans herz legen statt float gleich immer double zu nutzen 😉

    Auf'm aktuellen PC vielleicht, aber ein armer 8- Bitter plagt sich damit schon sehr - oft absolut unnötig.



  • pointercrash() schrieb:

    pixartist schrieb:

    im übrigen kann ich dir ans herz legen statt float gleich immer double zu nutzen 😉

    Auf'm aktuellen PC vielleicht, aber ein armer 8- Bitter plagt sich damit schon sehr - oft absolut unnötig.

    jo klar ^^


Anmelden zum Antworten