.:: Rubrique Arithmétique >> Division ::.
Comment on divise deux nombres?
J'ai 3 méthodes à vous
proposer:
xn+1=2*xn-a*xn²
avec a qui est le nombre à inverser, quand n tend vers l'infini,
xn tend vers 1/a. Et donc une fois qu'on a une approximation
correcte de 1/a, il suffit de multiplier 1/a par le nominateur et c'est
gagné!
Mais ya juste un p'tit problème: il faut partir d'une valeur de
x0 qui ne soit pas trop éloigné du résultat pour rendre le calcul
rapide. On
réfléchit...
a<10a.longueur
1/a>10-a.longueur
donc
on peut poser x0 = 10-a.longueur.
mais que faire de tout ça ???!!!!
Et bien don't panic!, une bonne méthode est d'utiliser la méthode 3 en la
combinant avec la seconde méthode:
Pour une division du type b/a, on cherche
d'abord une valeur approchée de 1/a, on la multiplie par b puis on ajuste cette
valeur grâce à la méthode 2.
Ce qui devrait donner algorithmiquement pour b/a:
|- * On pose x0 = 10-a.longueur; |
|- * On calcule xn jusqu'à ce qu'on trouve une valeur de xn ~ xn-1; |
|- * On multiplie xn par b et on sauve cette valeur dans Q (le quotient); |
|- * On pose R = Q*a; ce qui sera notre valeur initiale pour la méthode 2 et qui devrait être relativement proche de b. |
-------Si R > b------------------------ | -------Sinon--------------------------- |
|- * On boucle tant que R > b | |- * On boucle tant que R < b |
____|- * R reçoit R - a; | ____|- * R reçoit R + a; |
____|- * Q reçoit Q - 1; | ____|- * Q reçoit Q + 1; |
|- * Si R != a | |
____|- * Q reçoit Q - 1; |
|- * On affiche Q, qui est le résultat, si on veut :-) |
On commence donc par calculer une approximation de 1/a par l'algorithme de
newton,
Comme nos nombres sont des entiers uniquement, on va calculer
1/a*(X+4) avec X une puissance de 16 car on travaille en hexa et +4 car on va
enregistrer le résultat obtenu dans un registre 16 bits. Passons au code:
Voilà maintenant qu'on a une approximation de 1/a il va falloir passer à la
phase 2 de l'algo:
"La 2ème méthode" (je ne lui est pas encore trouvé de nom,
si vous avez des idées de nom ou bien si cet algorithme en porte déjà un vous
pouvez me faire parvenir vos idées par mail, merci d'avance je sais que c'est
pas le moment mais y a t'il quelqu'un qui vendrait un narguilé avec 4 embouts et
pour moins de 100 euros? idem, repondez moi, ça parait pas mais c'est
sérieux.)
Bon, où en étais-je?
ah oui, la 2ème méthode...on va devoir
multiplier b par l'approximation de 1/a puis multiplier cette valeur par le
"vrai" a et enfin sauver ce nombre. Ce qui se traduit par de l'assembleur à peu
près comme ça:
C'est pas plus compliqué que ça :-)
Maintenant il ne vous reste plus qu'à
faire la boucle pour ajuster la valeur et c'est gagné.
je vais quand même
vous aider un peu, je vous ai fait la fonction qui permet de comparer deux
nombre (c'est un peu prise de tête , alors merci qui?).
ça c'est cadeau:
Puis on teste le programme final:
C'est bon !!!Et voilà c'est terminé pour la division et pour cette rubrique aussi... une
petite larme?
Si vous êtes courageux vous pouvez vous amuser à coder des
logarithmes & co pour le plaisir pour ça je vous conseille de jeter un coup
d'oeil sur les séries entières.
Bon code et bon hack/crack :-)
Voici les différentes rubriques:
Daemonium Albus,
blaizard@caramail.com