Convertisseur de base mathématique

Zilack3

Binary Power !
13 Mars 2013
118
54
140
26
Convertisseur de base mathématique

AukT8Bg.png


Ce circuit permet de convertir un nombre à 4 digits d'une base n vers une base m avec n et m ∈ [2;16].

kTVdkD4.png

mT5AjVN.png

G82Im4U.png
- Etre en 1.7.2.
- Avoir la distance de rendu à 16 chunks.
- Pour sélectionner la base 16, il faut que le digit affiche 0.
- Le système ne peut pas faire la conversion de 0 d'une base quelconque vers une autre même si cela vaut toujours 0.
- Si vous voulez vérifier le résultat de la conversion, vous pouvez le faire sur cette page:
http://www.dcode.fr/conversion-base-n

- Sélectionner la valeur des digits à rentrer à l'aide des leviers.
- Sélectionner la base d'entrée.
- Sélectionner la base de sortie.
- Lancer le calcul.
- Attendre que la conversion se finisse (extinction de la lampe "processing").
r=0;
q=0;
for(i=0;i<4;i++){
r=a(i)*n^(i)+r;
}
for(i=0;i<16;i++){
q=q<<4; //4 décalages à gauche car un digit prend 4 bits.
q=quotient(r/m^(15-i))|q;
r=reste(r/m^(15-i));
}
La première optimisation est que le nombre de multiplication dépend de la taille de la valeur à convertir (détecter le rang du dernier digit différent de 0) et de la base entrante.
Pour les bases 2,4,8 et 16 en entrée, il n'y a aucune multiplication soit un saut à l'étape de la division.
La deuxième optimisation est que le nombre de division dépend de la taille de la valeur à convertir (détecter le rang du dernier digit différent de 0) et de la base sortante.
Pour les bases 2,4,8 et 16 en sortie, il n'y a aucune division soit un saut à l'étape de l'affichage du résultat.
Seulement 4 modules par multiplication et par division car un digit à une taille de 4 bits et un module traite un bits.
Toutes ces optimisations permettent de passer d'un temps de calcul toujours égale à 4min25 à un temps de calcul compris entre 0min13s et 3min20s.
t_max : 3min20s [eeee(15)->2120102222(3)]
t_min : 0min13s [0001(2)->0001(2)]
- 107236 blocs
- 92494 poudres
- 8617 torches
- 7008 repeaters

Lien de DL: https://drive.google.com/open?id=0B4Rrn2owLmJ8UTY2ZDRWSi1lNk0

PS : Tout les composants et les programmes ont été fait maison.
 
Dernière édition:

Zilack3

Binary Power !
13 Mars 2013
118
54
140
26
Màj : Toutes les conversions qui étaient avec des valeurs supérieures à respectivement 1 pour la base 2, 3 pour la base 4 et 7 pour la base 8 entrante débouchaient sur des erreurs.

Avant
hdGsMKG.png

Avant
fVYex1X.png

Après
sDpXvUi.png

Après
PZkWkeB.png

PS: Màj du lien de DL.
 

Zilack3

Binary Power !
13 Mars 2013
118
54
140
26
Salut,
Et bien en partant du principe que je n'utilise que les 7-Segments pour afficher un résultat, un bâton sera représenté par 1 et aucun symbole par un 0. On se rend vite compte que si on veut convertir ffff en base 16 vers la base unaire, et bien il faudrait 65535 7-Segments (cas extrêmes) soit la largeur de l'affichage qui prendrait 45055 chunks (soit beaucoup).
 
Dernière édition:

Zilack3

Binary Power !
13 Mars 2013
118
54
140
26
C'est vrai que ça nécessite une prise en charge de l'overflow pour pas grand chose.
Je pensais qu'elle était déjà existante.

Tu parles de quelle prise en charge de l'overflow ?

Superbe travail au passage :)

Merci !

Si j'implémentais la base unaire, le bus resterait sur 16 bits. Cependant il n'y aurait plus de "for(i=0;i<16;i++)" mais un "while(r!=0)" avec au maximum 65535 itérations. Finalement ce qui serait modifié serait la taille de l'affichage, l'ajout d'un bus d'adressage 16 bits pour écrire dans les 7-Segments, l'ajout d'un compteur 16 bits réliés au bus d'addressage, d'un soustracteur 16 bits avec comme première opérande la valeur à convertir et comme deuxième, la valeur 1 et enfin un si sinon + un rebouclage de la sortie du soustracteur sur la première opérande.

r=0;
q=0;
for(i=0;i<4;i++){
r=a(i)*n^(i)+r;
}
while(r!=0){
q=q<<4; //4 décalages à gauche car un digit prend 4 bits.
q=q|1;
r=r-1;
}

Si on part du principe que le soustracteur puisse donner des sorties stables 5s après l'allumage des entrées. Il faudrait tout de même 3 jours 19 heures 1 minutes 15 secondes* pour faire la conversion ffff(16) -> ....(1) (on est loin des 3min20).

*En ne comptant pas le temps de conversion base entrante vers base 2 et le temps d'écriture d'un 1 sur un 7-Segment.
 
Dernière édition:

retrocraftdu38

Bucheron
25 Août 2016
41
3
13
23
J'ai pas tout compris mais ca a l'air grandiose !!!
Si tu pouvais m'expliquer simplement :)
Et les différents couleurs des circuits :)

Pasque moi je m'intérésse beaucoup à la redstone mais les trucs comme ca faut bien m'expliquer:)
 

Zilack3

Binary Power !
13 Mars 2013
118
54
140
26
Ce circuit permet de convertir un nombre (à 4 chiffres) d'une base à une autre (entre 2 et 16).
D'abord l'utilisateur rentre un nombre à 4 chiffres (module violet), une base d'entrée (module rose) et une base de sortie (module marron).
Ensuite, le circuit fait la conversion "base d'entrée -> base 2" (module vert). Le module vert fait des multiplications.
Puis il fait la conversion "base 2 -> base de sortie" (module bleu). Le module bleu fait des divisions.
Chaque reste des divisions sera affiché (module orange).

Après, je ne sais pas ce que tu n'as pas compris, pourrais-tu préciser l'endroit que tu ne comprends pas stp.