Se ho capito bene dal codice che hai scritto sei ai primi passi. L'idea è praticabile e ti hanno già dato suggerimenti. Ma esistono altri sistemi, uno dei quali è quello delle bisezioni il cui codice accludo sotto. In questa circostanza utilizzare l'algoritmo delle bisezioni è chiaramente un "overkilling" ma penso che sia utile perché puoi utilizzare l'idea per casi più intricati e dove i numeri non sono interi. Come esercizio per i primi passi, una scansione dei valori è chiaramente accettabile ma in pratica è qualcosa che non si fa quasi mai.
Potresti se ti va e se credi, studiare come funziona il metodo di bisezione e migliorare il codice (non ho controllato il caso di <= rispetto a < e con gli interi si deve sempre fare attenzione) e ti resta nel tuo cassetto un metodo nuovo da usare in altri casi.
L'esercizio che devi svolgere è molto didattico perché consente anche una soluzione diretta, ed è quello che si cerca sempre di fare quando la matematica si fa dura. Una soluzione in forma chiusa è sempre meglio di una numerica. Quindi in ordine di efficacia hai: 1) scansione di intervallo di valori, eventualmente migliorabile con una stima del punto iniziale 2) Metodo numerico come quello delle bisezioni che vedi sotto 3) Forma chiusa. Puoi anche portargli tutte e tre le soluzioni
#include <stdio.h>
#include <stdlib.h>
/*
* funzione obiettivo:
*
* x * x < y si scrive (e si codifica) come
*
* FUN = x * x - y
*/
long function (long xval, long yval)
{
return ( xval * xval - yval ) ;
}
void make_iter (int *a_iter ,
long *a_res ,
long a_x1 ,
long a_x2 )
{
++(*a_iter) ;
(*a_res) = ( a_x1 + a_x2 ) / 2 ;
printf("iterazione %4d xnext = %4ld\n",(*a_iter),(*a_res)) ;
}
int main ()
{
int iter_no = 0 ;
int maxmitr = 20 ;
long xval ;
long yval ;
long a_inf ;
long b_sup ;
long allowed_err ;
long xnext ;
yval = 144 ; // valore dato
xval = 0 ; // valore di partenza
a_inf = 0 ; // intervallo in cui cercare
b_sup = 2000 ;
allowed_err = 1 ;
// mostra situazione iniziale
make_iter (&iter_no,&xval,a_inf,b_sup) ;
// esegui
do
{
if( function(a_inf,yval) * function(xval,yval) < 0 )
{
b_sup = xval ;
}
else
{
a_inf = xval ;
}
make_iter (&iter_no,&xnext,a_inf,b_sup) ;
if( abs((int)xnext-(int)xval) < allowed_err )
{
printf("\niterazioni %4d valore cercato = %d\n",iter_no,xnext) ;
return (0) ;
}
xval = xnext ;
}
while( iter_no < maxmitr ) ;
printf("procedura non converge o troppe iterazioni");
return (1) ;
}