Problem 1 Schleifendurchlauf zu viel!

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Problem 1 Schleifendurchlauf zu viel!

    /* Hallo, ich habe ein kleines Problem in der while-Schleife und zwar macht sie einen Durchlauf zu viel. Wer kann mir da helfen? Danke */

    Quellcode

    1. #include <stdio.h>
    2. int main(void)
    3. {
    4. double summand, summe, dPruef;
    5. int i, n, vz;
    6. /*
    7. Geometrische Reihe ausgeben:
    8. */
    9. dPruef = 0.0;
    10. summe = 1.0;
    11. i = 0;
    12. summand = 1.0;
    13. printf("Geometrische Reihe:\n");
    14. while (dPruef != 9.999)
    15. {
    16. i++;
    17. dPruef = summe;
    18. summand = 0.5 * summand;
    19. summe = summe + summand;
    20. if (dPruef == summe)
    21. {
    22. dPruef = 9.999;
    23. }
    24. printf("Summe: %.16lf, %2d. Durchlauf\n", summe, i);
    25. }
    26. printf("Es wurden n = %d Mal 1/1+1/2+...+1/2^n durchgefuehrt,\n die Summe betraegt: %.16lf.\nDie Anzahl der Summanden ist: %d", i, summe, i+1);
    27. getchar();
    28. return 0;
    29. }
    Alles anzeigen
  • Das Vergleichen mit Floating-Point Numbers ist relativ tricky.
    Ich würde dir empfehlen, folgendes zu machen:

    Quellcode

    1. while (1) // Endlosschleife!
    2. {
    3. i++;
    4. dPruef = summe;
    5. summand = 0.5 * summand;
    6. summe += summand;
    7. if (summand < 0.000001)
    8. {
    9. break; // verlasse die Schleife sofort!
    10. }
    11. printf("Summe: %.16lf, %2d. Durchlauf\n", summe, i);
    12. }
    Alles anzeigen


    Statt der 0.000001 bietet Visual C++ aich eine Konstante an. Ich weiß aber nich auswendig, wie die heißt :) (irgendwas mit DOUBLE und EPSILON)

    Dazu findest du im Netz viele Artikel. Such nach "C++ double ungenauigkeit"

    hth
  • Danke für den Lösungsvorschlag!

    Für mein Programm brauchte ich eine Genauigkeit von 16 Nachkommastellen.
    Dafür habe ich den Wert auf: 0.0000000000000001 geändert :) und es funktioniert prima.
    Für eine Genauigkeit, die den Wertebereich double ausschöpft muss man:

    Quellcode

    1. if (summand < DBL_MIN)
    2. {
    3. break;
    4. } //Angabe ohne Gewähr!

    und zusätzlich die Datei float.h einbinden. Ich habe das über google herausgefunden.
    Ohne den Tipp wäre ich nicht soweit gekommen.
    Danke nochmal!