Trigonométrie !

heealfear

Redstoner du dimanche
12 Octobre 2013
73
8
30
24
Sur ma chaise
Bonjour à vous !

Bon, ces derniers temps, je réfléchis à des modules pouvant me servir dans la réalisation d'une calculatrice scientifique, j'ai déjà fais des modules qui calculent la racine carrée ou encore qui trace la droite d'une fonction, mais là n'est pas le problème ...

En effet, le problème se trouve dans la trigonométrie (cos,sin,tan), mis à part CORDIC (et encore, je trouve aucune explication claire de cette algorithme), je ne trouve aucun moyen de calculer ces valeurs ! Est ce que quelqu'un pourrait m'expliquer l'algorithme de CORDIC ? Ou quelqu'un aurait-il un autre moyen de calculer ? Ou il faut mieux que je passe par juste une grosse ROM ou j'enregistre les résultats dedans ?

Merci d'avance :)
 

Mlakuss

Map Maker
26 Août 2011
305
56
134
Parce que c'est fun ?
Je dois avouer que je suis incapable de te dire comment arriver à calculer un sinus ou un cosinus sans faire 50 calculs.
En thérorie: ajouter/retirer 2pi à ton nombre jusqu'à être dans l'intervalle [0,2pi], considérer que tu as les coordonnées d'un point dans un repère polaire (ou cylindrique plan) et faire la conversion en cartésien: le x obtenu, c'est le cosinus, le y, le sinus (et tangente, c'est sin/cos)
Si tu as déjà la multiplication et la somme dans ta calculatrice, ça doit être faisable.
 
  • J'aime
Reactions: heealfear

[GISED] Link

Torches, poudre et repeaters. What else ?
4 Mars 2012
341
76
140
29
VNSA, 2740 Moutier
vnsa.ch
586293ThundeRedResearchDepartment2.jpg


Calcul du sinus d'un angle
(en combinatoire)​

Bonjour à tous, amateur de redstone.

On va voir ici comment faire un circuit qui nous calcule le sinus d'un angle. Vous avez peur ? Pas de soucis, si on commence par le début et qu'on avance gentiment jusqu'à la fin, tout devrait bien se passer.

Donc posons le problème :

Nous donnons une valeur qui correspondra à un angle, et nous recevrons une valeur qui correspondra à son sinus. Alors, plusieurs point à régler d’emblée :
  1. Un angle peut être exprimé en radian ou en degré (ou autre mais pas utile ici),
  2. Le sinus d'un angle est toujours compris entre -1 et 1. Donc des valeurs à virgules, et ça, c'est pas cool.
  3. La précision est quelque chose de très critique, que je vais détailler plus loin
Alors, on va tenter de faciliter la tâche : Et de l'utilisateur, Et de celui qui devra réaliser le circuit, en disant ceci :
  1. La valeur d'entrée du circuit sera comprise entre 0 et 90 (donc un angle en degré). Un circuit additionnel devra être utilisé pour gérer les signes et toujours rester dans cette plage de valeur (modulo de la division de l'angle ?).
  2. Pour éviter les virgules, notre circuit nous donnera des valeurs comprises entre 0 et 255 (8 bits). Il suffira alors de diviser la valeur obtenue par 255 pour avoir la vraie valeur du sinus.
  3. Au sujet de la précision, on verra que ça peut vite varier selon l'angle donné
Tout est clair ? On peut commencer ? Bien... mais, euh... On va où maintenant avec ça ? Eh bien, on va se diriger vers les entrailles des

:eek::eek::eek::eek::eek: Mathématiques :eek::eek::eek::eek::eek:​
Chapitre 1 : Développement de Taylor :cool:
Je passe, je vais pas faire des maths ici, c'est un terrain trop dangereux.​
Donc, selon ce théorème, on peut écrire le sinus autour du point x=0 comme suit (faites moi confiance) :​
Code:
      1      3
x - ( --- * x  )  // avec x en Radian !!!!
      6
Je m'arrête volontairement à la 3ème puissance, car sinon on va avoir un circuit dont la taille va exploser. Et la précision . . . Très bonne entre 0 et 60°, après, c'est à vous de juger. On en reparlera avec les graphes plus bas.​
Chapitre 2 : La formule magique :confused:
Bien, maintenant que vous savez comment obtenir un sinus (c'est cool nan ?), il faut encore :​
  1. Transformer mon angle de degré en radian (l'entrée est en degré, la formule utilise des radians)
  2. Diminuer le nombre de multiplication (parce que chaud quand même...)
  3. Diminuer le nombre de constante
  4. Mettre en forme le résultat pour qu'il soit compris entre 0 et 255
  5. Toujours, toujours, toujours avoir dans la tête cette histoire de précision, c'est très important
La partie qui suit est mise en forme à l'aide de mathematica, pour des questions de lisibilité.
327453Thoriep1.jpg
622556Thoriep2.jpg
Pour le shift : Diviser par une puissance de 2 c'est comme si on décalait la valeur binaire de log2(x) à droite. Ici pour plus d'info.​
Okay, Je sais, la théorie c'est chiant, mais dans notre cas, c'était indispensable. Mais retenez cette formule, et on va voir un graphe pour estimer notre précision :​
313317fonctionapprox2.jpg

Bien bien... Alors qu'est-ce que cette belle fonction va nous donner ? regardons !


C'est quoi ces Floor :rolleyes:

Floor(), cela signifie qu'on a pris uniquement la valeur entière de la division, arrondie vers le bas (Floor (1,8) = 1 ). Parce que je travaille en 8 bits, il y a des fois des résultats qui dépasse un peu, donc je m'arrange pour prendre les 8 qui m'intéressent et je met à la poubelle tout le reste. Donc, évidemment, ça crée des "saut", c'est ce qu'on voit sur le graphe en haut.

Ici on voit tout de suite la précision... Il est évident qu'on a va prendre C=76. Les testes ont montrés qu'on était encore assez précis.

Et voici les testes :
113398Graphiquederreur.png

La courbe jaune-orange représente l'erreur du à la résolution de 8 bit (sin(87°) =255 ... donc pas top) .

Et pis dans minecraft gros Malin ? :mad:

Tu as été patient ? Alors ça donne qqch qui peut ressembler à ça :
44757220141001234453.png

Une petite vue

28643020141001234549.png

en bas : l'entrée, et les lampes en haut : le résultat sur 8 bits !

Il suffira de diviser la valeur que vous recevez par 255 et vous aurez votre sinus !
 

Asu

Cheval d'égout
Ancien
2 Avril 2011
1 862
420
217
23
Bouches-du-Rhône, France
... j'ai jamais comprit pourquoi des personnes construise des gros systèmes comme sa alors que sa va jamais servir !
Pour se dire que je l'est fait?
Pour avoir une map avec des GO de mémoire?
Pour passer le temps?
S'amuser?

Les 4, ahah

Sinon, "le plus simple" ça ne serait pas de faire un micro-ordinateur 8-bit style z80? Et de récup un OS déjà fait ou d'utiliser un compilo? Ça serait d'autant plus génial que ça serait programmable mais ça serait relativement lent et très long à faire o:
 

[GISED] Link

Torches, poudre et repeaters. What else ?
4 Mars 2012
341
76
140
29
VNSA, 2740 Moutier
vnsa.ch
z80 ? Pas encore fait dans minecraft je pense XD (en même temps c'est normal). Sinon pour les processeur qui existe :

Aha, alors oui on peut programmer la fonction sinus (en utilisant l’algorithme CORDIC), sans que ça prenne trop de temps et tout et tout. Donc, avec des algorithmes itératifs, on peut facilement le faire sans trop de code à faire. Mais malheureusement, il faut des CPUs avec des fonctions assez poussés sinon la taille du code en assembleur va exploser (j'estime). Mais faisable. On verra quand mon télégraphe sera prêt (dans 3 à 6 mois ?)

Et si mon circuit prend de la place, c'est surtout parce que j'ai utiliser des éléments pas optimisé. Je pense que je ferai une version compacte quand j'aurai fini mon diviseur compacte.

Et ouais, si on fait ça c'est parce que c'est cool ! Yen a d'autre qui s'amuse à grailler dans le noyau linux... Chacun son tripe. En plus si on peut apprendre des choses, mettre en "pratique" ce qu'on a appris, ce n'est que plus bénéfique. Bon après pas obligé de faire le vieux pépé comme moi je fais en écrivant des romans sur les forums XD
 

Asu

Cheval d'égout
Ancien
2 Avril 2011
1 862
420
217
23
Bouches-du-Rhône, France
A mon avis, il faudrait un logiciel poussé pour faire ça correctement, ou au moins un mod.
Mais à mon avis, il faut essayer de faire un export ASM depuis du C++ (GCC sait faire ça) pour voir la taille. D'ailleurs c'est pas vraiment la taille de l'ASM qui compte mais plutôt du code machine rendu. Enfin, c'est pas trop différent quand même...

Sinon, il faudrait que quelqu'un fasse une réplique d'une Ti (Basée sur z80 paskeucéb1) sur minecraft et qu'il fasse un mod pour y upload le programme.

Après je pensais faire quelques petits tests de toggle compacts et persistants pour faire de la RAM/ROM.

Au fait, en parlant de ton télégraphe, il permettra de faire quoi? :3 (Répondre sur mon profil pour pas trop polluer)