2016-04-24 3 views
-4

Если я удалю while и выберите одно условие в if, else if, else, я могу получить результат. Но когда я добавляю циркуляцию while в решение функции, происходит бесконечный цикл. Пожалуйста, выясните, где проблема?Что не так с этим тиражом?

#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

Почему вы отметили это как C++? –

+2

Вы уже пробовали распечатать значение 'diff' в конце каждого цикла? – JVApen

+2

Равенство в числах с плавающей запятой не является хорошей идеей - см. [Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой] (https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) –

ответ

0

Прежде всего это c не C++ !!! Если вы возвращаете diff, вы каждый раз получаете значение меньше 0,001, как решение. Я думаю, вы должны вернуть x3. Если вы спросите fun(x3) == 0, то забава (x3) должна быть полностью равна нулю. Вы никогда не достигнете этого, в большинстве случаев с поплавками. Лучше сделайте так:

 funx3=fun(x3); 

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

Кроме того, это не будет работать во всех случаях. Чтобы исправить это использование, удваивается в вашей программе. Вы также получите больше десятичных знаков. Я не полностью уверен, что все десятичные разряды будут правы. Может быть, вы хотите нарезать одну eralier.

#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

Неплохо, я изменил x1 на diff, чтобы распечатать diff и забыл изменить его. Imma будьте осторожны при пометке в следующий раз. Сожалею. – Mashiro

+0

Я изменяю поплавки на парные, как вы сказали, и это работает. Но я все еще смущен тем, что float имеет 6 значительных цифр, и я выбрал diff> 0.001 в качестве условий суждения. Почему поплавки по-прежнему недостаточно точны? – Mashiro

Смежные вопросы