Redstone Création Logarithme népérien en redstone!

corleoff

Aventurier
30 Avril 2020
3
0
1
20
Alors bonjour,
Je suis nouveau sur le forum mais je n'en suis pas un sur minecraft et dans le monde de la redstone. J'ai 16 ans et j'ai commencé sur pocket édition en 2011... J'aimerai partager un algorithme qui calcule le logarithme népérien d'un nombre... Alors d'où vient l'idée? L'idée vient du faite que j'ai déjà fais des multiplicateurs, adders (cla), sub, diviseurs en redstone et surtout un "extracteur" de racine carrée qui suit l’algorithme de la potence. Alors je voulais calculer log() car j'en avais vaguement entendu parlé au lycée (je suis en seconde)... . J'ai fais des recherches et j'ai vite compris que si je voulais calculer log(), je devais calculer ln()... ( log x (y) = ln(y) / ln(x) )... J'ai donc cherché un algorithme pour calculer ln(). J'en suis arrivé à ln(x) est environ = à x-1 si x app. à l'int. [0.999; 1.001]. Première itération : Racine carrée de x puis Racine carrée de racine... de x jusqu’à ce que x app. à [0.999; 1.001]. Puis soustraite 1 est multiplier par 2 exposant n , soit n le nombre d'itération... Nickel ! Pour les racines carrées on a l’algorithme de la potence et pour multiplier par 2 exp. n bah facile c'est du binaire ! Il suffit d'un barrel shifter. Apres avoir réfléchi à tout ça je me suis lancé et il m'a fallu quelques dizaines heures pour réaliser cet algorithme. Alors quelques screens puis les détails !
2020-04-30_18.51.21.png

2020-04-30_18.51.42.png

Alors en détail : "l'extracteur" de racine carré est composé de cla en mode sub. Puis bah... ça suit l’algorithme de la potence. Il fait 40 bits input et 20 bits output sauf que vu qu'on boucle on n'utilise que 20 bits en entrée. Virgule flottante oblige, il y a deux barrels shifters un pour la sortie de la racine carrée : il décalage vers la gauche (Dans mon cas c'est vers le haut, le bit le plus faible est en bas) pour avoir le plus d'info possible sur les décimales. Donc il clock il compte le nombre d'itération puis le x - 1 c'est facile on ne prends pas le biten sorti, et tout ce qui est après la virgule on décale avec le deuxième barrel shifter.

En finalité, il calcule le logarithme népérien d'un nombre compris dans l'int. [1;99]. Chaque itération dure environ 40 seconde et il y a moyenne 11.5 itérations... Voila voila la vitesse du calcule... Pour ce qui est du résultat qui n'est pas très juste : ce qui a avant la virgule ça va, les dixième aussi puis après c'est moins précis Par exemple : pour ln(17) il trouve 2.82031 or ln(17)=2.83321 Et cela pour tous les calculs. Pour le rendre plus précis je pourrais rajouter des bits à mon "extracteur" de racine carrée mais là n'est pas le but...
2020-04-30_19.14.40.png

En gris avec les boutons : inputs 8 bits reliés directement au barrel shifter, en orange la sortie sur 12 bits, en bas à droite le nombre d'itérations. Pour ln(17) il y a bien 12 itérations.
Après bien évidemment je peux relier le système avec des afficheurs 7 segments, un double dabble. Base 10 vers base 2 en entrée et vice vers ça en sortie mais je préférais le système dénudé comme ça.

bref Voila voila, si vous avez des questions ou que vous vous voulez que je m'attarde un peu plus sur le sujet n’hésitez pas et puis j'ai d'autre systèmes dans mon sac...
Prenez soins de vous bye.