Calcul de la racine carrée.
Il existe plusieurs algorithmes pour calculer la racine carrée d'un nombre positif. En voici deux:
1) Sachant que calculer la racine carrée de a revient à résoudre l'équation x2=a. On peut transformer celle-ci en:
x2=a Û 2 x2= x2 + a Û x = (x2 + a)/(2x) Û x = (x + a/x)/2
L'idée de génie (de qui?) a été de distinguer les x suivant les membres où ils se trouvaient pour donner la formule:
En faisant cela, on retrouvait la formule de Newton (ou formule de la tangente) qui affirme que dans le cas présent, le nombre de chiffres significatifs est au moins doublé à chaque calcul.
NOTE: le calcul peut commencer avec n'importe quelle valeur de x (différente de 0).
Exemple: x2=2
x0=1
x1=0.5*(1+2/1)=3/2=1.5
x2=0.5*(1.5+2/1.5)=17/12=1.4166666
x2=0.5*(1.416666+2/1.416666)=577/408=1.41421568
....
2) Voici un autre algorithme qui calcule la racine carrée d'un nombre réel a:
- écrire le nombre a par tranches de 2 chiffres à partir de la virgule
- du groupe le plus à gauche, soustraire les impairs successifs (à partir de 1) et s'arrêter avant de passer dans les nombres négatifs
- le premier chiffre du résultat est le nombre de soustractions effectuées à l'étape précédente
- recommencer avec le reste des soustractions suivi du 2ème groupe de chiffres du nombre a mais le premier impair à soustraire est le dernier impair soustrait à l'étape précédente, augmenté de 1 puis multiplié par 10 et augmenté de 1 (cela revient à accoler un 1 à la droite du dernier nombre impair soustrait augmenté de 1).
- recommencer avec le reste des soustractions suivi du 3ème groupe de chiffres du nombre a mais le premier impair à soustraire est le dernier impair soustrait à l'étape précédente, augmenté de 1 puis multiplié par 10 et augmenté de 1 (cela revient à accoler un 1 à la droite du dernier nombre impair soustrait augmenté de 1).
Exemple: a=543,21
On écrit ce nombre par tranche de deux (en partant de la virgule) 5 43 , 21 00
Du premier groupe, on soustrait les premiers nombres impairs : 5-1-3=1.
Comme nous avons effectué 2 soustractions, le premier chiffre est un 2.
On recommence avec 143 (le reste des soustractions suivi du deuxième groupe) dont on soustrait les impairs à partir de 41 (dernier impair utilisé augmenté de 1 puis multiplié par 10 et augmenté de 1) : 143-41-43-45=14
La racine approchée est donc 23 (puisqu’il y a eu 3 soustractions)
On recommence avec 1421 (le reste des soustractions suivi du groupe suivant) dont on soustrait les impairs à partir de 461 (dernier impair utilisé augmenté de 1 puis multiplié par 10 et augmenté de 1) : 1421-461-463-465=34
La racine approchée est donc 23,3 (puisqu’il y a eu 3 soustractions)
On recommence avec 3400 (le reste des soustractions suivi du groupe suivant) dont on soustrait les impairs à partir de 4661 (dernier impair utilisé augmenté de 1 puis multiplié par 10 et augmenté de 1) : 3400-4661 est négatif!
La racine approchée est donc 23,30 (puisqu’il y a eu 0 soustraction)
PROGRAM RACINE;
VAR x,x2,Rac:REAL;
i,N,Cpt,N_Dec,PartieEntiere,Divi:LONGINT;
BEGIN
WRITE('Introduisez le nombre dont il faut calculer la racine: ');
READLN(x);
x:=ABS(x);(* Pour le rendre positif *)
x2:=x; (* Sauvegardé pour l'affichage final *)
(* Calcul du 1er chiffre - Aurait pu se faire par les logarithmes *)
PartieEntiere:=TRUNC(x);
N:=PartieEntiere;
Divi:=1;
WHILE NOT (N=0) DO
BEGIN
Divi:=Divi*100;
N:=N DIV 100;
END;
Divi:=Divi DIV 100;
N:=PartieEntiere DIV Divi; (* La tranche la plus à gauche *)
PartieEntiere:=PartieEntiere-N*Divi; (* Les autres chiffres *)
i:=1; (* i contient les nombres impairs successifs *)
Cpt:=0; (* Cpt compte les soustractions *)
WHILE NOT (N-i<0) DO
BEGIN
N:=N-i;
INC(Cpt);
INC(i,2);
END;
Rac:=Cpt; (* 1er chiffre *)
DEC(i,2);
(* Calcul des autres chiffres de la partie entière *)
Divi:=Divi DIV 100;
WHILE NOT (Divi=0) DO
BEGIN
N:=N*100+PartieEntiere DIV Divi;
i:=(i+1)*10+1;
Cpt:=0;
WHILE NOT (N-i<0) DO
BEGIN
N:=N-i;
INC(i,2);INC(Cpt);
END;
DEC(i,2);
Rac:=Rac*10+Cpt;
PartieEntiere:=PartieEntiere-(PartieEntiere DIV Divi)*Divi;
Divi:=Divi DIV 100;
END;
(* Calcul des chiffres de la partie décimale *)
x:=x-TRUNC(x);
Divi:=10;
N_Dec:=6;(* N_Dec = nombre de décimales *)
WHILE NOT (N_Dec=0) DO
BEGIN
N:=N*100+TRUNC(x*100);
i:=(i+1)*10+1;
Cpt:=0;
WHILE NOT (N-i<0) DO
BEGIN
N:=N-i;
INC(i,2);INC(Cpt);
END;
DEC(i,2);DEC(N_Dec);
Rac:=Rac+Cpt/Divi;WRITELN(Rac:9:6);
x:=x-TRUNC(x*100);Divi:=Divi*10;
END;
WRITELN('Valeur par l''algo:',Rac:10:3);
WRITELN('Valeur par SQRT:',SQRT(x2):10:3);
READLN;
END.
Page précédente.
Page d'accueil.