/**
* @Author: Guglielmo Fachini a.k.a GuglielmoS
* @Purpose: Dimostrare il metodo di bisezione per ricavare gli zeri di una funzione.
* @Date: 11/03/2010
*/
#include <stdio.h>
#include <math.h>
/* Precisione perfetta: pow(x, 2) + 2*x + 1 */
#define FUN(x) pow(3,(x))+(x)-2
/*
* Rappresenta la funzione di cui bisogna trovare gli zeri.
*/
inline double f(double x) {
return FUN(x);
}
/*
* Ritorna il valore medio tra a e b.
*/
inline double M(double a, double b) {
return (a+b)/2;
}
/*
* Ritorna il segno del valore di 'a'.
*/
inline char sign(double a) {
return (a >= 0) ? '+' : '-';
}
/*
* Ritorna la precisione tra i valori a e b.
*/
int getPrecisionOf(double a, double b) {
double diff;
int prec;
prec = 0;
diff = fabs(a-b) * 10;
while (floor(diff) == 0) {
prec++;
diff *= 10;
}
return prec;
}
int main(int argc, char **argv) {
double a, b, m;
printf("----------------------------------------------------\n");
printf("| %-7s | %-7s | %4s | %4s | %-7s | %4s |\n",
" a", " b", "f(a)", "f(b)", " m", "f(m)");
a = 0; b = 1;
while (getPrecisionOf(a, b) <= 5) {
double fa, fb, fm;
printf("----------------------------------------------------\n");
fa = f(a); /* calcolo f(a) */
fb = f(b); /* calcolo f(b) */
m = M(a, b); /* calcolo il valor medio tra a e b */
fm = f(m); /* calcolo f(m) */
printf("| %.5lf | %.5lf | %c | %c | %.5lf | %c |\n",
a, b, sign(fa), sign(fb), m, sign(fm));
if (sign(fa) == sign(f(m)))
a = m;
else
b = m;
}
printf("----------------------------------------------------\n");
return 0;
}