gilou Modérateur Modosaurus Rex | Déja ça marche pas à cause de ceci:
Code :
- if (cos((borneinf+bornesup)/2) > 0)
- {
- z = ((borneinf+bornesup)/2);
- return racinedecos(borneinf, z);
- }
- else if (cos((borneinf+bornesup)/2) < 0)
- {
- z = ((borneinf+bornesup)/2);
- return racinedecos(z, bornesup);
- }
|
qui devrait être
Code :
- if (cos((borneinf+bornesup)/2) > 0)
- {
- z = ((borneinf+bornesup)/2);
- return racinedecos(z, bornesup);
- }
- else if (cos((borneinf+bornesup)/2) < 0)
- {
- z = ((borneinf+bornesup)/2);
- return racinedecos(borneinf, z);
- }
|
D'autre part, il faut un test d'arrêt un peu plus efficace, par exemple s’arrêter quand bornesup - borneinf ne diminue plus car on est en bout de précision.
ça donne ceci (réécrit pour essayer de faire de la tail récursion)
Code :
- #include <iostream>
- #include <iomanip>
- #include <cmath>
- using namespace std;
- double racinedecos(double borneinf, double bornesup, double delta)
- {
- double z = (borneinf + bornesup)/2;
- double d = bornesup - borneinf;
- if (cos(z) == 0 || d == delta) { return z; }
-
- double s, t;
- if (cos(z) > 0) {
- s = z;
- t = bornesup;
- }
- else
- {
- s = borneinf;
- t = z;
- }
- return racinedecos(s, t, d);
- }
- int main()
- {
- double inf = 0, sup = 2;
- double X = racinedecos(inf, sup, 0);
- cout << "La racine de la fonction cosinus qui est comprise entre 0 et 2 vaut " << setprecision(15) << X << endl;
- return 0;
- }
|
qui exécuté donne
La racine de la fonction cosinus qui est comprise entre 0 et 2 vaut 1.5707963267949 (calculé en 55 appels récursifs)
A+, Message édité par gilou le 16-03-2013 à 01:17:52 ---------------
There's more than what can be linked! -- Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- No jab ? No job ! -- (╯°□°)╯︵ ┻━┻
|