MATH_ChangeBase [Arithmetique]
Par Micael Germann (Math4D v1)
Nouvelle recherche
Si (Faux)
` MATH_ChangeBase [Micaël Germann 25/07/2002]
` ---------------------------------------------
` Cette fonction permet d'exprimer
` un nombre entier positif donné dans une autre base quelconque;
` Limitations:
` - les bases supérieures à 36 ne sont pas reconnues,
` faute de symbolique adéquate connue de l'auteur
` - les nombres sont exprimés en chaine de caractères,
` ce qui implique que leurs représentations ne doit pas
` excéder 255 caractères (limite actuelle de 4D);
` - Le nombre doit être inférieur à MaxLong
` ---------------------------------------------
` Rappels mathématiques :
` Un nombre entier peut être exprimé dans n'importe quelle base;
` Dans la vie quotidienne, la base 10 est utilisée (notation décimale),
` en informatique il est fréquent de parler en base 16 (notation hexadécimale),
` voir en base 8 pour des anciens systèmes (notation octale);
` Les informations sont physiquement stockées en base 2 dans un ordinateur
` (notation binaire), mais il peut être parfois utile de coder un nombre dans
` une base supérieure, afin de diminuer la place prise par sa représentation;
` RAPPEL: il ne s'agit que de la représenatation du nombre, pas sa valeur
` qui elle reste inchangée;
` L'algorithme de conversion proposé ci-dessous travail en deux temps:
` 1- conversion du nombre en base 10 par élévation à la puissance
` de la base d'origine de chaque digit en fonction de son ordre;
` 2 - conversion dans la base de destination par modulo et division entière;
` ---------------------------------------------
` MATH_ChangeBase (ChaineNombre; BaseOrigine; BaseDestination) -> Chaine
` ChaineNombre (Alpha 255car) Nombre dont on veut une autre représentation
` BaseOrigine (Numérique) Base dans laquelle le nombre est exprimé
` BaseDestination (Numérique) Base dans laquelle on veut sa représentation
` Résultat (Chaine) Représentation
` ---------------------------------------------
` MATHERROR
` 0 -> Pas d'erreur
` -1 -> Au moins un car; de chaine nombre n'est pas compatible avec base origine
` -2 -> Une des bases n'est pas gérée (non comprise dans l'intervalle [2;36])
` -3 -> La chaine résultante dépasse 255 caractères
` -4 -> La valeur de Nombre en base 10 est supérieur ou égal à MaxLong
` ---------------------------------------------
` ATTENTION
` Pensez à utiliser une chaine suffisament longue pour le résultat
`
Fin de si
C_ENTIER LONG(MATHERROR)
C_ALPHA(255;$1)
C_ENTIER LONG($2;$3)
C_ALPHA(255;$0)
$0:=""
` Traitement des erreurs de base
Au cas ou
: (($2<2) | ($2>36) | ($3<2) | ($3>36)) ` les bases indiquées sont-elles supportées
MATHERROR:=-2
Sinon
MATHERROR:=0
Fin de cas
` Algorithme
Si (MATHERROR=0)
C_ALPHA(255;$Nbre;$NewBase)
C_ALPHA(36;$Caract)
C_ENTIER LONG($Origine;$Destination;$Base10)
$Origine:=$2
$Destination:=$3
$Caract:="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
$Nbre:=Majusc($1) ` Les caractères du nombre sont-ils corrects
$OK:=Vrai
Boucle ($t;1;Longueur($Nbre)) ` On boucle sur tous les caractères
$pos:=Position($Nbre²$t³;$Caract)
Si (($pos>$Origine) | ($pos=0)) ` Le caractère doit appatenir à la base d'origine
$OK:=Faux `Si ce n'est pas le cas, on le signale à l'algorithme de conversion
$t:=256 ` et on sort de la boucle, inutile de vérifier plus loin
Fin de si
Fin de boucle
Si ($OK) ` Si la chaine est vérifiée, on convertit le nombre en base dix
Si ($Origine#10) ` Traitement conventionnel si la base d'origine # 10
$Base10:=0
Boucle ($t;1;Longueur($Nbre)) ` Conversion caractère par caractère
$Base10:=($Base10*$Origine)+Position($Nbre²$t³;$Caract)-1
Fin de boucle
Sinon
$Base10:=Num($Nbre) ` Plus rapide si la donnée est déjà en base 10
Fin de si
Si (($Base10>0) & ($Base10