C-Programm double1 / double2 Falsches Ergebnis
-
skorpion710 schrieb:
hallo ich habe folgendes problem ich möchte in meinem in c geschriebenen programm zwei doubles durch einander teilen bekomme aber nicht das zu erwartende ergebniss. kann mir jemand sagen warum das nicht geht? vllt liegt es ja an den bit stellen die von double belegt werden aber dazu weis ich zu wenig bitte um hilfe!
e = 2.718281828459045
q01 = 3.5355339059327373
pi = 3.141592653589793
c1 = 3.6674121258056132ec = pow(e, -pow(q01,2)); hilfe = pow(pi, 0.5)*c1; chalb = ec / hilfe;
daraus folgt
ec = 3.7266531720786803e-006
hilfe = 6.5003187452417430daraus müsste laut excel und taschenrechner folgen das
chalb = 5,73303143758389E-007
als ausgabe für chalb bekomme ich aber
chalb = 1.2143247822661227e-005
Dieses Programm:
#include <stdio.h> #include <math.h> int main(int argc, const char * argv[]) { double e = 2.718281828459045; double q01 = 3.5355339059327373; double pi = 3.141592653589793; double c1 = 3.6674121258056132; double ec = pow(e, -pow(q01,2)); double hilfe = pow(pi, 0.5)*c1; double chalb = ec / hilfe; printf( " ec = %g\n", ec ); printf( "hilfe = %g\n", hilfe); printf( "chalb = %g\n", chalb); return 0; }
Liefert:
ec = 3.72665e-006
hilfe = 6.50032
chalb = 5.73303e-007Dein Problem ist ausnahmsweise mal nicht der Pentium FDIV Fehler.
mfg Martin
-
#include <math.h> #include <stdio.h> int main (void) { double eb; double e; double q02; double hilfe2; double pi; double b1; double chalb; pi = 3.141592653589793; e = 2.718281828459045; printf("Q"); scanf("%lf",&q02); printf("B"); scanf("%lf",&b1); eb = pow(e, -pow(q02,2)); hilfe2 = (pow(pi, 0.5)*b1); chalb = eb/hilfe2; }
ich hab das jetzt so versucht was aber komischer weise richtig funktioniert ich hab echt keine ahnung was daran falsch ist also an meinem ursprungs programm (ausschnitt siehe unten)
@dare alle variablen sind im double deklariert
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; } }
-
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?
-
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
-
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.