Нахождение корня функции методом деления отрезка пополам.Но есть случай когда программа не работает

Если ввести функцию 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
→ Ссылка