2016-04-24 5 views
-4

Wenn ich die while entferne und eine Bedingung in der if, else if, else auswähle, kann ich ein Ergebnis erhalten. Aber wenn ich die while Zirkulation in die Funktion auflöse, passiert eine Endlosschleife. Bitte finde heraus, wo das Problem liegt.Was stimmt nicht mit dieser Zirkulation?

#include<stdio.h> 
#include<math.h> 
int a, b, c, d; 
float fun(float x); 
float solve(void); 

int main() 
{ 
    printf("Put in the coefficient of the equation:\n"); 
    scanf("%d", &a); 
    scanf("%d", &b); 
    scanf("%d", &c); 
    scanf("%d", &d); 

    float ans = solve(); 

    printf("A solve for the equation:x=%.3f", ans); 

    return 0; 
} 

float fun(float x) 
{ 
    float value = a * x * x * x + b * x * x + c * x + d; 

    return value; 
} 

float solve(void) 
{ 
    float x1 = -100, x2 = 100, x3; 
    float diff = fabs(fun(x1) - fun(x2)); 
    while (diff > 0.001) 
    { 
     x3 = (x1 * fun(x2) - x2 * fun(x1))/(fun(x2) - fun(x1)); 

     if (fun(x3) == 0) 
     { 
      x1 = x3; 
      x2 = x3; 
     } 
     else if ((fun(x3) * fun(x1)) < 0) 
     { 
      x2 = x3; 
     } 
     else 
     { 
      x1 = x3; 
     } 

     diff = fabs(fun(x1) - fun(x2)); 
    } 

    return diff; 
} 
+5

Warum haben Sie dies als C++ markiert? –

+2

Haben Sie bereits versucht, den Wert von 'diff' am Ende jeder Schleife auszudrucken? – JVApen

+2

Gleichheit in Fließkommazahlen ist keine gute Idee - siehe [Was jeder Informatiker über Gleitkommaarithmetik wissen sollte] (https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) –

Antwort

0

Vor allem das ist nicht C++ !!! Wenn Sie diff zurückgeben, erhalten Sie immer einen Wert, der kleiner als 0,001 ist. Ich denke, du solltest x3 zurückgeben. Wenn Sie fragen fun(x3) == 0 Spaß (x3) muss vollständig gleich Null sein. Das erreichen Sie in den meisten Fällen niemals mit Floats. Besser geht es so:

 funx3=fun(x3); 

     if (funx3 == 0.0 || funx3>0.0 &&funx3<0.001 || funx3<0.0 && funx3>-0.001) 
     { 
      x1 = x3; 
      x2 = x3; 
     } 

Auch das wird nicht in allen Fällen funktionieren. Um das zu beheben, verdoppelt sich das in Ihrem gesamten Programm. Sie erhalten auch mehr Nachkommastellen. Ich bin nicht ganz sicher, ob alle Nachkommastellen stimmen. Vielleicht hast du einen Geralier geschnitten.

#include<stdio.h> 
#include<math.h> 
int a, b, c, d; 
double fun(float x); 
double solve(void); 

int main() 
{ 
    printf("Put in the coefficient of the equation:\n"); 
    scanf("%d", &a); 
    scanf("%d", &b); 
    scanf("%d", &c); 
    scanf("%d", &d); 

    float ans = solve(); 

    printf("A solve for the equation:x=%.8f", ans); 

    return 0; 
} 

double fun(float x) 
{ 
    double value = a * x * x * x + b * x * x + c * x + d; 

    return value; 
} 

double solve(void) 
{ 
    double x1 = -100, x2 =100, x3; 
    double diff = fabs(fun(x1) - fun(x2)); 
    double funx3; 
    while (diff > 0.0000001) 
    { 
     x3 = (x1 * fun(x2) - x2 * fun(x1))/(fun(x2) - fun(x1)); 

     funx3=fun(x3); 

     if (funx3 == 0.0 || funx3>0.0 &&funx3<0.0000001 || funx3<0.0 && funx3>-0.0000001) 
     { 
      x1 = x3; 
      x2 = x3; 
     } 
     else if ((fun(x3) * fun(x1)) < 0.0) 
     { 
      x2 = x3; 
     } 
     else 
     { 
      x1 = x3; 
     } 

     diff = fabs(fun(x1) - fun(x2)); 
    } 

    return x3; 
} 
+0

Mein Fehler, ich habe x1 in diff geändert, um das diff zu drucken, und habe vergessen, es zurück zu ändern. Seien Sie beim nächsten Mal vorsichtig. Es tut uns leid. – Mashiro

+0

Ich ändere Floats in Doubles, wie Sie gesagt haben, und es funktioniert. Aber ich bin immer noch verwirrt, dass Float 6 signifikante Zahlen hat und ich habe Diff> 0,001 als Bewertungsbedingungen gewählt. Warum sind Floats immer noch nicht präzise genug? – Mashiro

Verwandte Themen