C-Programm double1 / double2 Falsches Ergebnis



  • cn und bn seien bekannte constanten vom typ doulbe wie alle anderen variablen bis auf die variablen in der for schleife (n,j,...) in den for schleifen auch bei chalb und b halb tritt das problem auf



  • mgaeckler schrieb:

    skorpion710 schrieb:

    thx martin hab das jtzt auch so ähnlich ausprobirt wie oben geht auch wunder bar ich versteh nur nicht warum s bei mir im programm dann das falsch ausgibt wenn ich mit visual studios um debuggin modus bin seh ich ec und hilfe ja und kann die werte dafür ablesen doch die rechenopperation mach er nicht ich vermute das noch irgent welche speicherstellen besetzt sind und der deswegen irgent wo was einschleußt irgent welche tipps?

    Könnte es sein, daß der Optimierer das rumpfuscht? Hast Du einfach mal alle Optimierungen ausgeschaltet. Zur Not hilft vieleicht im Assembercode zu debuggen. Das müsste doch Visual Studio können, oder?

    mfg Martin

    Schwachsinn. Bei dem Code wundert mich nicht, wenn er keinen Fehler findet. Richtig hässlich.



  • mgaeckler schrieb:

    Könnte es sein, daß der Optimierer das rumpfuscht? Hast Du einfach mal alle Optimierungen ausgeschaltet. Zur Not hilft vieleicht im Assembercode zu debuggen. Das müsste doch Visual Studio können, oder?

    mfg Martin

    tut mir leid ich weis bei beidem nicht wie man das abstellt bzw einstellt ich bin wie gesagt anfänger natürlich kann das sein denk ich mal aber wie gesagt ich kann es nicht überprüfen ^^ soll ich mal den ganzen quelltet posten und jemand haut den durch n anderes programm oder so um zu gucken ob das überhaupt geht oder ob n fehler im programm is?



  • 314159265358979 schrieb:

    Schwachsinn. Bei dem Code wundert mich nicht, wenn er keinen Fehler findet. Richtig hässlich.

    😕 Was ist daran hässlich? Hättest Du gerne ein Blümchenmuster als hintergrund?

    mfg Martin



  • Wie sind denn die Arrays z und Wo definiert?



  • skorpion710 schrieb:

    mgaeckler schrieb:

    Könnte es sein, daß der Optimierer das rumpfuscht? Hast Du einfach mal alle Optimierungen ausgeschaltet. Zur Not hilft vieleicht im Assembercode zu debuggen. Das müsste doch Visual Studio können, oder?

    mfg Martin

    tut mir leid ich weis bei beidem nicht wie man das abstellt bzw einstellt ich bin wie gesagt anfänger natürlich kann das sein denk ich mal aber wie gesagt ich kann es nicht überprüfen ^^ soll ich mal den ganzen quelltet posten und jemand haut den durch n anderes programm oder so um zu gucken ob das überhaupt geht oder ob n fehler im programm is?

    Schaden gibt's jedenfalls keinen, wenn Du mal einen kompletten übersetzbaren Code postest, sofern dieser nicht zu groß ist.

    mfg Martin



  • mein problem hatsich in wohlgefallen aufgelöst warum auch immer trozdem vielen dank an alle



  • trozdem hier der "ganze code"

    #include <math.h>
    #include <stdio.h>
    #include "fakultaet.h"
    
    int main (void)
    {
    	double pi;
    	double e;
    	int erfolg;
    	int fertig;
    	double H;
    	double F;
    	int G;
    	int K;
    	double c1;
    	double c;
    	double chalb;
    	double b;
    	double b1;
    	double bhalb;
    	double w;
    	double x;
    	double p;
    	int i;
    	int n;
    	int y;
    	double cn;
    	double bn;
    	double x01;
    	double x02;
    	double q01;
    	double q02;
    	int Wo[30];
    	double ec;
    	double yk[1000];
    	double ym[1000];
    	double yG[1000];
    	double yX[1000];
    	double x1;
    	double x2;
    	double hilfe;
    	double hilfe2;
    	int R;
    	double eb;
    	double z[31];
    	int q;
    	int j;
    
    	pi = 3.141592653589793;
    	e = 2.718281828459045;
    
    	erfolg = fertig = 0;
    	while (!fertig)
    	{
    		printf(" Mittelwert \n"); ///
    		fflush(stdin);
    		erfolg = scanf("%lf", &H);
    
    		if (erfolg == 1 && H >= 0)
    			fertig = 1;
    		else
    			printf("Falsche Eingabe, bitte erneut probieren! ");
    	}
    
    	erfolg = fertig = 0;
    
    	while (!fertig)
    	{
    		printf(" Standartabweichung \n");
    		fflush(stdin);
    		erfolg = scanf("%lf", &F);
    
    		if (erfolg == 1 && F > 0)
    			fertig = 1;
    		else
    			printf("Falsche Eingabe!");
    	}
    
    	erfolg = fertig = 0;
    
    	while (!fertig)
    	{
    		printf(" Numerische Genauigkeit mindestens 5 \n");
    		fflush(stdin);
    		erfolg = scanf("%d", &G);
    
    		if (erfolg == 1 && G >= 5)
    			fertig = 1;
    		else
    			printf("Falsche Eingabe!");
    	}
    
    	R = G * 6;
    
    	erfolg = fertig = 0;
    
    	while (!fertig)
    	{
    		printf(" Umfang der Probe (mindestens %d)", R);
    		fflush(stdin);
    		erfolg = scanf("%d", &K);
    
    		if (erfolg == 1 && K >= 6*G)
    			fertig = 1;
    		else
    			printf("Falsche Eingabe!");
    	}
    
    	w = 5.0;
    	x = w/G;
    	p = w/G;
    
    	// 1 2 Alternierung
    	for (y = 29; y>=0 ; y--)
    	{
    		Wo[y] = y % 2 + 1;
    	}
    
    	// Errechnen der Wahrscheinlichkeiten aus Quantiltabelle
    	for (n = 1; n <= G; n++)
    	{
    		c1 = 0.0;
    		b1 = 0.0;
    		chalb = 0.0;
    
    		cn = p*(n);
    
    		if (cn <= 4.09)
    		{
    			for (i = 0; i <= 30 ; i++)
    			{
    				x01 = cn / (pow (2 , 0.5)) ;
    				x1 = (pow ((-1.0), i) * pow (x01, ((2*i)+1)))/(((2*x01)+1) * fak(i));
    				c1 = c1 + x1;
    			}
    			chalb = c1*(2/(pow (pi , 0.5)));
    		}
    		else
    		{
    			for (q = 29; q >= 0; q--)
    
    			{
    				q01 = cn / (pow (2 , 0.5)) ;
    				z[30] = q01 + (31 / (2 * q01));
    				z[q] = (Wo[q] * q01) + ((q+1)/(z[q+1]));
    				c1 = z[0];
    			}
    		ec = pow(e, -pow(q01,2));
    		hilfe = pow(pi, 0.5)*c1;
    		chalb = ec / hilfe;
    
    		}
    		bn = p*(n-1);
    
    		if (bn <= 4.09)
    		{
    			for (j = 0; j<= 30 ; j++)
    			{
    				x02 = bn / (pow (2 , 0.5)) ;
    				x2 = (pow ((-1.0), j) * pow (x02, ((2*j)+1)))/(((2*x02)+1) * fak(j));
    				b1 = b1 + x2;
    			}
    			bhalb = b1*(2/(pow (pi, 0.5)));
    		}
    		else
    		{
    			for (q = 29; q >= 0; q--)
    			{
    				q02 = bn / (pow (2 , 0.5)) ;
    				z[30] = q02 + (31 / (2 * q02));
    				z[q] = (Wo[q] * q02) + ((q+1)/(z[q+1]));
    				b1 = z[0];
    			}
    		eb = pow(e, -pow(q02,2));
    		hilfe2 = (pow(pi, 0.5)*b1);
    		chalb = eb/hilfe2;
    		}
    
    	c = 0.5 + chalb/2;
    	b = 0.5 + bhalb/2;
    	yk[n] = c - b;
    	ym[n] = yk[n];
    	ym[n+G] = yk[n];
    	yG[n] = yk[n] * K;
    	yX[n] = pow (yk[n], yG[n]);
    	yX[n+G] = pow (yk[n], yG[n]);
    	}
    }
    

    ob hässlich oder nicht;)

    fakultaet.h und fakultaet.c sind einfach nur fakultäten bis zu der gewissen zahl is denk ich den meisten bekannt

    mfg skorpion



  • Nabend,

    was ich jetzt spontan noch sehe ist fflush auf stdin. Das soll eigentlich nicht so gemacht werden.

    Hab aber auch nur flüchtig drüber geschaut...



  • Die Chance, dass sich jemand hässlichen Code anschaut und dir deine Fehler aufzeigt, sinkt mit dem Grad der Hässlichkeit.

    Schreibe die Formel, die du beabsichtigst zu implementieren, daneben, reduziere die Variablenanzahl auf 10% und benenne sie lesbar.

    Vielleicht steigen deine Chancen dann wieder.


Anmelden zum Antworten