Acceuil
Ecrivez-moi :
raphael dot pasquier at free dot fr
Mise à jour le 2 octobre 2006
|
|
VERSION pdf ::
ps ::
tex
Algorithmes pour calculer les décimales de
En utilisant les égalités sur la racine carré
,
,
pour des nombres positifs et , on vérifie facilement
les quelques formules suivantes sur :
Les égalités précédentes sur peuvent nous permettre de calculer de "bonnes" approximations
de ce nombre.
En effet au voisinage de 0, on peut décomposer la fonction
en
une série entière. Plus précisement on montre que : tel que
on a :
c'est-à-dire avec
La série converge donc en prenant par exemple
Ce développement en série entière permet de calculer en ne faisant que des additions,
soustractions, et des multiplications et divisions avec de petits entiers.
Pour comprendre tout l'intérêt des algorithmes proposés, un détour doit être fait sur une méthode
pour représenter les "réels" dans les ordinateurs, et qu'on appelle flottants à virgule fixe.
Pour la clarté de l'exposé je vais raisonner sur un représentation en base 10 mais n'importe quel base
convient. En particulier pour l'implémentation en langage C, l'auteur a utlisé la base qui
permet de stocker un chiffre sur un entier de type long ( ie 32 bits).
Cette représentaion repose sur le simple fait que tout nombre décimale n'ayant que chiffres
après la virgule s'écrit sous la forme
où est en entier relatif.
Si on se fixe un précision ( ce qui revient à fixer p), il suffit d'enregistrer l'entier pour
enregistrer le nombre décimal.
De plus l'addition et la soustraction entre nombres décimales à chiffres après la virgule se fait
simplement en faisant les opérations sur les numérateurs :
ainsi que les multplications et divisions par un entier :
Par exemple dans cette représentaion, si on travaille avec chiffres après la virgule, le réel
avec zéros correspond à l'entier
avec zéros.
Pour une explication plus détaillée, je vous renvoie à la page de mon site sur la représentation des
nombres.
Ainsi pour calculer avec une précision à près (avec par exemple),
on est ramené à faire des additions, des soustractions sur des entiers de grande taille
(de l'ordre de ) et des multiplications, divisions par de "petits" entiers
( en général inférieur à dix millions) comme nous allons le voir dans le prochain paragraphe.
En posant
et
Pour obtenir une approximation de , il suffit de calculer la série partielle
Le nombre dépend du nombre de décimales voulues.
Une méthode simple consiste à calculer par récurrence en se servant des égalités :
ou encore
On peut utiliser la deuxième égalité, ce qui donne l'algorithme suivant :
 |
|
 |
|
 |
|
répéter |
|
 |
(1) |
 |
(2) |
 |
(3) |
 |
(4) |
 |
|
jusqu'à  |
|
 |
(5) |
 |
(6) |
afficher
 |
|
Remarques :
- Comme on peut le voir sur l'algorithme précédent, on fait des additions et soustractions sur de
grands entiers (lignes (3) et (4)) des divisions par de petits entiers (lignes (1), (2) et (6))
et une multiplication par un petit entier (ligne (5)).
Pour la ligne (2), on divise bien par un petit entier car pour calculer
avec chiffres après la virgule par exemple, varie entre 0 et
et plus généralement pour avoir chiffres après la virgule, il faut prendre
qui est un entier petit pour des valeurs de inférieures à
(valeurs courantes en pratique).
- J'ai choisi la deuxième égalité pour
car il est plus facile de faire deux divisions
avec de petits diviseurs que de faire une multiplication puis une division par des entiers
qui dépasseraient la taille d'un chiffre dans la base que j'ai choisi ( cad dans mon cas).
- L'algorithme a un comportement asymptotique de l'ordre de
: i.e. pour doubler le nombre
de décimales exactes, il faut multiplier par le temps de calcul.
- Puisque
et
, on gagne
asymptotiquement chiffres par itération ( ce qui explique la "lenteur" relative de
l'algorithme).
Résultats :
- Voici le temps mis par le programme de l'auteur :
nombre de décimales exactes |
5 000 |
10 000 |
100 000 |
1 000 000 |
2 560 000 |
durée du calcul en secondes |
0.08 |
0.3 |
28.7 |
3375.4 |
22680.1 |
- Configuration :
- Processeur : Athlon K7 700 Mhz.
- Carte mère : ASUS K7M supportant 256 Mo de SDRAM à 100 Mhz.
- Système d'exploitation : Mandrake8.2.
- Compilateur : gcc-3.0.4.
- En pratique :
- Pour compiler le programme, tapez dans une console (dans le répertoire contenant le source) :
gmake
- Pour exécuter le programme :
./pii sqrt2 10
où est le nombre de décimales justes désirées.
This document was generated using the
LaTeX2HTML translator Version 2002-2-1 (1.70)
Copyright © 1993, 1994, 1995, 1996,
Nikos Drakos,
Computer Based Learning Unit, University of Leeds.
Copyright © 1997, 1998, 1999,
Ross Moore,
Mathematics Department, Macquarie University, Sydney.
The command line arguments were:
latex2html -split 1 info_sqrt2.tex
The translation was initiated by raphi on 2004-05-30
|