Accueil

Les 4 opérations en multi précision

Calculs numériques en multi précision

1 Principe

1 Principe

2 Les 4 opérations en multi précision

3 Quelques fonctions en multi précision

4 Application : Pi en multi précision

5 Application : Inversion de matrice en multi précision


  La plupart des calculs se satisfont de la simple précision ( 6 à 8 décimales ).
  Des applications plus "pointues" exigent la double précision ( 15 à18 décimales ).
  Le recours à la multi précision s'impose, non seulement dans la course aux décimales de Pi, mais aussi dans quelques applications pratiques, l'inversion de grandes matrices par exemple.


  Chacun des nombres à traiter en multi précision sera découpé en blocs de 6 chiffres, autant de blocs de part et d'autre de la virgule ( le recours à la virgule flottante serait plus économique en mémoires et en durée de calcul, mais compliquerait la programmation )

  Ainsi le nombre N = -1 234 567 890.123 456 789 , sera mémorisé dans une variable dimensionnée N(10) sous la forme :

N(10) N(9) N(8) N(7) N(6) N(5) N(4) N(3) N(2) N(1) N(0)
0 0 0 1234 567890 123456 789000 0 0 0 -1

l'élément  N(0) étant réservé au signe du nombre.

  Toutes les opérations, y compris la simple addition de deux nombres, feront appel à des sous programmes spécifiques chargés de gérer ces tableaux de nombres .

 La programmation sera bien plus facile qu'il n'y parait, si partant d'un programme bien rodé en double précision on remplace chaque opération élémentaire par un appel au sous programme chargé d'effectuer cette opération en multi précision.

  Avant d'approfondir et afin de convaincre le lecteur de la simplicité de la technique, voici une démonstration du calcul de factoriel 1000 .      Rappelons  que :
  1000! = 1 x 2 x 3 x 4 ... x 999 x 1000  

 Ce court programme Visual Basic permet, après compilation, d'afficher les 2568 chiffres de 1000! en moins d'une seconde.

Private Sub Form_Activate()
ReDim Fact(500)
Form1.Height = 9000
Form1.Width = 6400
Form1.AutoRedraw = True
Form1.Caption = " 1 000 ! ="
Nbr = 1000
Fact(1) = 1
For I = 1 To Nbr
     For J = 1 To 500
           Rel = Fact(J) * I + Ret
           Ret = Int(Rel / 1000000#)
           Fact(J) = Rel - 1000000# * Ret
     Next J
Next I
T = 0
For I = 430 To 1 Step -1
Print Tab(3 + T * 8); Format(Fact(I), "000000");
T = T + 1
If T Mod 10 = 0 Then T = 0: Print ;
Next I
End Sub

  En opérant méthodiquement la programmation en multi précision ne pose aucune difficulté particulière.

  Un exemple simple : programmer Exp(x) en multi précision à partir de son développement :

  Le rapport entre deux termes successifs se réduit à la division de 2 nombres

d'où, dans la forme classique, le programme

 

  En détaillant, on obtient cette nouvelle version, qui après introduction de variables dimensionnées : Relais() , Terme()..., facilitera le remplacement d'instruction telle que:

Relais = Terme * X

par un appel au sous programme de multiplication :

PROD Terme(),X(),Relais(),Indic 

  Il resterait donc à substituer des variables dimensionnées X(N), Exp_X(N) ... à chacune des variables et à remplacer chaque ligne de calcul par un sous programme préexistant :
- conversion d'un nombre simple ou double précision en multi précision
- multiplication de 2 nombres en multi précision
- division d'un nombre en multi précision par un entier
et sortir de la boucle lorsque les blocs de 6 chiffres du tableau  Terme()  seront tous nuls.


Extraire la page pour l'enregistrer ou l'imprimer