Algorithme CORDIC en python
RésoluLongo_11 Messages postés 5 Date d'inscription Statut Membre Dernière intervention -
- Cordic python
- Logiciel algorithme euromillion - Télécharger - Loisirs créatifs
- Logiciel algorithme gratuit - Télécharger - Édition & Programmation
- Algorithme euromillion excel gratuit ✓ - Forum VB / VBA
- Algorithme ajout rapide snapchat - Forum Snapchat
- Ajout rapide snap - Forum Snapchat
5 réponses
Bonjour,
Préliminaires
Il y a deux problèmes dans le lien que tu pointes :
- Il y a deux variables : K (en majuscule) est effectivement un flottant, et ce qui est noté k (en minuscule) qui est en réalité i.
- On ne peut pas appliquer >> si l'opérande de gauche est u flottant, comme c'est le cas ici. En C/C++ on joue effectivement sur les décalages de bits pour accélérer les divisions par 2, mais c'est quelque chose que je déconseille très fortement sur un type non entier (la manière dont est encodé un flottant en mémoire est très différente). L'algorithme CORDIC proposé dans wikipedia confirme bien que l'auteur a bien voulu parler de divisions par des puissances de 2. Il faut donc changer ">> i" par "/ (2 ** i)".
Code proposé : en tenant compte des remarques faites en préliminaires :
#!/usr/bin/env python3 from math import atan, radians def cordic(theta: float) -> tuple: """ Approximates (cos(theta), sin(theta)) using the CORDIC algorithm. Args: theta (float): An angle, in radians. Returns: An approximation of (cos(theta), sin(theta)). """ K = 0.6072529350088814 n = 27 atan_tab = [atan(2 ** (-i)) for i in range(0, n + 1)] x = K y = 0 ecart = theta for i in range(0, n + 1): s = 1 if ecart >= 0 else -1 aux = x - (s * y / (2 ** i)) y += (s * (x / (2 ** i))) x = aux ecart -= s * atan_tab[i] return (x, y) print(cordic(radians(30)))
(Depuis je l'ai rajouté dans la page wikipedia française dédiée)
Résultat : on retrouve bien un résultat conforme à celui qu'on peut simuler sur le site que tu pointes (ici pour 30°).
(0.8660254012499423, 0.5000000043898769)
Remarque : si tu es fan des décalages de bits, tu pourrais par contre remplacer le calcul (2 ** i) par :
def two_power_of_i(i): return (2 << (i - 1) if i >= 1 else 1) for i in range(10): print(i, two_power_of_i(i))
0 1
1 2
2 4
3 8
4 16
5 32
6 64
7 128
8 256
9 512
Même si je ne te cache pas que personne n'écrirait ça en python :p D'ailleurs la plupart des gens se contenteraient de simplement utiliser math.sin ou math.cos.
Bonne chance
Salut,
Pour le calcul, c'est plutôt :
num = int(input("Entrez un nombre: ")) rot = int(input("Entrez le nombre de rotation: ")) print(num >> rot)
Merci pour ta réponse oui sur python c’est de la forme X >> rot avec comme rot constante ou variable.
Cordialement
Bonsoir
Merci pour vos réponses.J’ai terminé le programme en assembleur.
IL y a 10 passes et 5 chiffres décimaux et la précision est de 0,0137 pour le Sinus de 55 degrés’. cela prend 345781 cycles machine et occupe 200 octets de mémoire . Je vais mettre le code dans la section ASM.
Je ne sais pas comment faire pour marquer cela résolu.
Encore merci pour vos réponses
Cordialement
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question