Sua assinatura vai ser assim:
double root(double (*f)(double), double i, double e);O "f" é o identificador do ponteiro, do lado esquerdo fica o valor de retorno da função, e entre parênteses, do lado direito, os parâmetros. Imagina que quiséssemos um ponteiro para uma função com dois parâmetros, teríamos então:
double (*f)(double, double);Então se quiséssemos a usar no corpo da função usaríamos, por exemplo:
f(1.0, 5.2);Aqui está o meu código, que acha a raíz da função x² - 1. Se quisermos usar a função root para outra função, só precisamos trocar o ponteiro.
template <class T> bool eqlZero(T x) { return x * x < 0.000000001; } double f(double x){ return x * x - 1.0; } // finds one root between i and e double root(double (*f)(double), double i, double e) { int iterationsLeft = 10000; while(iterationsLeft--) { double x = (i+e) / 2.0; cout << x << endl; if(eqlZero(f(x))){ return x; } else if(f(x) < 0) { i = x; } else { e = x; } } } int _tmain(int argc, _TCHAR* argv[]) { double result = root(f, -10.0, 10.0); cout << result; return 0; }Esse código dá como saída o seguinte (que é quando vale a variável x a cada iteração):
0Outra forma de implementar essa função root genérica, seria com funtores (classes com o operator ()), mas isso seria demais para esse caso. Saiba mais sobre ponteiros para funções.
5
2.5
1.25
0.625
0.9375
1.09375
1.01563
0.976563
0.996094
1.00586
1.00098
0.998535
0.999756
1.00037
1.00006
0.999908
0.999985
0.999985
Nenhum comentário:
Postar um comentário