You are not logged in.

  • Login

Dear visitor, welcome to Coder Forum. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Sunday, October 22nd 2006, 4:41pm

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 */

C Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
 
int main(void)
{
	double summand, summe, dPruef;
	int i, n, vz;
 
/* 
Geometrische Reihe ausgeben:
*/
        dPruef     =  0.0;
	summe    =  1.0;
	i              =    0;
	summand =  1.0;
 
	printf("Geometrische Reihe:\n");
 
	while (dPruef != 9.999)
	{
		i++;
                dPruef = summe;
                summand = 0.5 * summand;
                summe = summe + summand;
                if (dPruef == summe)
                {
                       dPruef = 9.999;
                 }
                 printf("Summe: %.16lf,   %2d. Durchlauf\n", summe, i);
	}
 
	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);
 
 getchar();
 return 0;
}

2

Tuesday, October 24th 2006, 12:42pm

Das Vergleichen mit Floating-Point Numbers ist relativ tricky.
Ich würde dir empfehlen, folgendes zu machen:

C Quellcode

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


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

3

Tuesday, October 24th 2006, 6:28pm

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:

C Quellcode

1
2
3
4
if (summand < DBL_MIN)
{
    break;
} //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!

Social bookmarks