Нахождение корня функции методом деления отрезка пополам.Но есть случай когда программа не работает
Если ввести функцию sin(x)*50*M_PI и а=313 b=316,то программа не работает, что я сделал не так и что необходимо еще добавить?
#include <stdio.h>
#include <math.h>
int sign(double x)
{
if (x>0) return 1;
if (x<0) return -1;
return 0;
}
int funkciya=0;
double f( double x)
{
++funkciya;
return sin(x)*50*M_PI;
}
double root_half(double a, double b, double (*f)(double), double eps)
{
double c,fa=f(a),fb=f(b),fc; int number = 0;
if( fabs(fa)<eps ){ printf("Number of iterations: 1\n"); return a;}
if( fabs(fb)<eps ) { printf("Number of iterations: 1\n"); return b;}
if(sign(fa) == sign(fb)) {printf("Method does not run\n");return 0;}
for(;fabs(b-a)>=eps; number++)
{
c=(a+b)/2;
fc=f(c);
if (fc == 0)
{
printf("Number of iterations: %d\n",number);
return c;
}
if (sign(fc) == sign(fa)) { a = c; } else { b = c;}
}
printf("Number of iterations: %d\n",number);
return c;
}
int main(void)
{
double a,b;
scanf("%le %le",&a,&b);
printf("root = %lf\n",root_half(a,b,f,1e-15));
printf("Function calls: %d\n",funkciya);
return 0;
}
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Вы слишком подняли точность - double с ней не справляется, и вычисление
c = (a+b)/2
дает то же значение - c==a. Добавьте вывод с большой точностью и убедитесь...
Не тянет представление double столько знаков. Дайте eps == e-13`, и все получится.
Часто (но не всегда) имеет смысл задавать относительную погрешность - условие не
fabs(b-a) >= eps
а
fabs((b-a)/a) >= eps