Bien qu'en C++, la bibliothèque standard <math.h> mette déjà à la disposition du programmeur la fonction sqrt, laquelle permet de calculer rapidement et efficacement la racine carrée d'un nombre, il peut néanmoins être très instructif et même amusant de reproduire soi-même cet algorithme. En effet, comprendre les principes mathématiques qui se cachent derrière une fonction aussi fondamentale permet de mieux apprécier le fonctionnement des bibliothèques numériques et les techniques d'approximation employées par les compilateurs modernes. De plus, cette démarche constitue un excellent exercice de programmation pour quiconque souhaite approfondir ses connaissances en calcul numérique ou simplement relever un défi intellectuel. Il n'est pas nécessaire de recourir à des méthodes particulièrement complexes pour obtenir un résultat précis : une fonction bien conçue permet déjà d'atteindre une excellente approximation de la racine carrée. Pour répondre à cette curiosité et illustrer concrètement le principe de fonctionnement, il suffit d'écrire une fonction semblable à celle présentée ci-dessous en C++, laquelle effectue le calcul de la racine carrée sans faire appel directement à la fonction sqrt de la bibliothèque mathématique :
Essayer maintenant !
- #include <iostream>
-
- double SquareRoot(double X) {
- double A,B,M,XN;
- if(X==0.0) {
- return 0.0;
- } else {
- M=1.0;
- XN=X;
- while(XN>=2.0) {
- XN=0.25*XN;
- M=2.0*M;
- }
- while(XN<0.5) {
- XN=4.0*XN;
- M=0.5*M;
- }
- A=XN;
- B=1.0-XN;
- do {
- A=A*(1.0+0.5*B);
- B=0.25*(3.0+B)*B*B;
- } while(B>=1.0E-15);
- return A*M;
- }
- }
-
- int main() {
- double R=2.0;
- while(R<=1000.0) {
- std::cout << "Sqrt(" << R << ")=" << SquareRoot(R) << std::endl;
- R*=R;
- }
- return 0;
- }
on obtiendra le résultat suivant :
Sqrt(2)= 1.41421Sqrt(4)= 2.0000
Sqrt(16)= 4.0000
Sqrt(256)= 16.0000