/* File: ricerca0.c */
/* Legge da tastiera due valori reali, a e b, tale che ya = f(a) abbia segno
   diverso da yb=f(b), e stampa uno zero della funzione y = f(x) (cioe' un
   valore ris tale che yris = f(ris) = 0).  Adotta i metodo (semplificato) di
   Newton.    Si ferma quando l'intervallo |f((a+b)/2)| <= EPSILON */*/

#include <stdio.h>
#include <math.h>

#define EPSILON 0.000000001

double funzione(double x) {
  return 2*x*x*x - 4*x + 1;
}


int main(void)
{
  double a;
  double b;
  double m;
  int i = 0;  /* Quante iterazioni sono necessarie? i ne tiene traccia */
  printf("Inserire estremi intervallo dove cercare lo 0\n");
  printf("Inserire primo estremo: ");
  scanf("%lg", &a);
  printf("Inserire secondo estremo: ");
  scanf("%lg", &b);

  if (funzione(a)*funzione(b) >= 0) {
    printf("Intervallo non valido!\n");
    return 0;  /* esce dal programma! */
  }
    
  m = (a+b)/2;

  while (fabs(funzione(m)) > EPSILON) {
    if (funzione(a)*funzione(m) < 0) 
      b = m;
    else 
      a = m;
    m = (a+b)/2;
    i++;
  }

  printf("Zero della funzione e' x = %.9g\n", m);
  printf("In x = %.9g, y = %g\n", m, funzione(m));
  printf("Numero iterazioni: %d\n", i);

  return 0;
}

