Voilà, j´savais pas trop où poster ça mais bon, me suis dit que ça avait sa place ici quand même. Bon, la question est donc : comment fait un processeur pour multiplier? Il peut pas mémoriser tous les résultats (beaucoup trop de mémoire, et puis comme on peut faire les nombres qu´on veut...), donc il doit logiquement fonctionner par "addition" (3 * 4 = 3 + 3 + 3 + 3), mais ça paraît bancal pour des trucs genre 7.776 * 0.123, donc non. Donc, la question peut paraître stupide mais : comment qu´il fait?
:merci d´avance. ![]()
Mais t´es con ou quoi? As-tu vu un certain forum "Sciences et Technologies" pendant ton long voyage vers ce forum? Crois-tu vraiment que ton "truc" est paranormal? Le jour ou tu le prouveras, tu me donneras 10 claques si tu veux...
Oups, excuse mille pardons je me croyais dans le forum paranormal qui comme vous la savez grouille de boulets. je suis con ... ![]()
Ce n´est certainement pas une question stupide.
C´est assez compliqué. En fait avant même de vouloir comprendre comment un programme peut multiplier 2 nombres, il faut déjà savoir comment un ordinateur "représente" les nombres.
Ce qui est en partie expliqué là :
http://www.commentcamarche.net/base/representation.php3
Le maître Fvirtman saura nous expliquer ça ! ![]()
O grand sage, fait déteindre sur nous la connaissance de l´ordinateur ![]()
maniac_de_pc==>MDR!
Ahlalala tu m´redonnes le sourire d´un coup, dommage que j´aille me coucher dans pas longtemps.
tantale==>Merci beaucoup, très intéressant comme lien. ![]()
En général, il s´agit effectivement de mettre sous forme de sommes de multiplications élémentaires. Après tu as des astuces du style "on s´arrange pour mettre le maximum de multiplication par 2", ou "on s´arrange pour calculer de manière non-redondante les termes de la somme", etc.
Après il faut avoir également des méthodes efficaces pour additionner ^^
Je ne m´y connais pas trop dans ce domaine...
En tout cas, les ordinateurs "comptent" en base 2 (binaire) mais à mon avis, tu dois le savoir...
Au niveau des multiplications, je n´en sais rien du tout...
Est-ce que ça a un rapport avec les portes logiques ![]()
Je sais précisemment comment se passe une addition, mais je n´ai aucune idée de la facon dont s´opère une multiplication non-naturelle. (c´est à dire avec des 0.123)
Heu...ce n´est pas si facile que ça de faire une addition. Au niveau élémentaire, une porte logique suffit effectivement, mais des grosses additions, il faut mieux avoir des techniques, parce que si tu commences à y aller comme un bourrin sur des trucs aussi simple...Il ne faut pas oublier que ce n´est pas juste "on fait +1" mais qu´il faut utiliser des "transistors" (même si ce n´est pas exactement ça) et faire mumuse avec le courant.
cf. Sujet d´info chez les CCP cette année.
A titre d´information, j´ai pris en photo un schéma d´additionneur 4 bits :
http://img380.imageshack.us/img380/6488/cimg04472lv.jpg
Je ne me souviens plus très bien de son fonctionnement donc je vais peut-être dire une bêtise, mais il fonctionne bien avec des additions.
Si on regarde l´addition en binaire en haut à gauche, on peut voir que ça se passe à peu près comme en décimal. On multiplie le premier chiffre de B par A, puis le deuxième chiffre de B par A,... et ensuite on additionne le tout, en décallant le résultat d´un rang à chaque fois.
Or, comme on est en binaire, chaque chiffre vaut soit 0 soit 1. Multiplier un nombre par 0 donne forcément 0, et multiplier un nombre par 1 donne le même nombre.
Voici le truc. Au départ le résultat vaut 0. Ensuite on va prendre un par un les chiffres de B. A chaque fois que le chiffre de B vaut 0, on ne touche pas au résultat. A chaque fois que le chiffre de B vaut 1, on ajoute à droite de A le nombre de 0 qui correspond à la position du chiffre de B testé, puis on ajoute le nombre A décalé au résultat.
Les ordinateurs actuels utilisent sûrement une autre méthode plus rapide, mais ce schéma donne déjà une idée.
Je ne pense pas avoir été très clair, donc si vous avez des questions n´hésitez pas.
J´ai compris son principe d´addition mais le schéma en lui-même... :/ Déjà, quand tu parles de "porte" je comprends pas, alors... ![]()
dans un processeur, les multiplications sur les entiers et sur les rationnel( puisqu´on ne manipule pas de réel dans un processeur) ne se font pas pareil.
les rationnels sont stocké sous la forme x*2^y
x*2^y * x´*2^y´ devient donc: (x*y)*2^(y+y´)
bon vous allez me dire, et comment multiplier des entiers. Si l´on considère un processeur 32 bits, il y a juste a faire 32 additions et décalage de bit. (multiplier par deux, c´est décaler un bit a gauche)
Euh...pourtant il existe (en C notemment) une fonction "racine" (sqrt si je me rappelle bien), or racine de 2 n´est pas un rationnel, donc...y´a un hic quelque part. ![]()
sqrt(2) renvoie une valeur approchée de racine de 2.
En fait, un ordinateur peut stocker des réels. Dans la plupart des cas, il est stocké sous la forme :
xyyyyyyyyyyyyyyyzzzzzzzzzzzzzzzz
x représente le signe (1 pour négatif et 0 pour positif). y représente un nombre codé en binaire classique correspondant au nombre sans la virgule et z représente le nombre de zéros à ajouter avant ou après (z peut être négatif).
Par exemple, si on prends le nombre sqrt(2)=1.4142, on aura :
x=0 car le nombre est positif
y=14142
z=-4, car il faut décaler y de 4 rangs vers la gauche
Par contre, je ne me souviens plus du nombre exact de bits y et de bits z.
Il existe un algorithme qui permet de faire sqrt(2) et agissant directement sur les 0 et les 1 du nombre. Je vais esayer de le retrouver, mais c´est pas gagné.
iunity : Cela permet juste de représenter des nombres qui admettent une écriture finie (et pas trop grande !) dans la base choisie, en tout cas uniquement des rationnels. Or sqrt(2) est irrationnel...
Effectivement, les nombres ayant trop de décimales seront arrondis. En même temps, je ne suis pas sûr que ce genre de nombre soit codé sur 32 bits, il y en a peut-être plus.
Tous les nombres irrationnels sont arrondis, comme les nombres trop grands. C´est pour ça qu´en C il faut éviter les comparaisons entre des float (voir le tutoriel de JYY à l´adresse
http://perso.numericable.fr/~fvirtman/info/tuto/G_15_testdouble.cpp ).
Si vous etes intéressé par le fonctionnement de la mémoire et des processeurs, j´avais suivi un cours en licence d´informatique que j´avais retapé. il est sur mon site : (cf ma carte)
rubrique fac / licence info / "technologie des ordinateurs part 1 & 2"
Pour la multiplication des nombres entiers, le schéma donné par iunity est juste :
l´ordi procede comme on apprend a l´école primaire : d´abord, on multiplie les chiffres un par un, puis on additionne le tout avec des nombres décalés.
Pour multiplier des chiffres binaires (car c´est ce que fait l´ordi), on utilise un ET logique, symbolisé par & sur le schéma : en binaire, pas de retenue pour une multiplication.
Sinon, pour les additionneurs, ça marche également comme on apprend a l´école (cf le cours sur mon site qui parle d´additionneurs)
Les flottants sont codés comme le dit iunity.
Les parties dont il parle s´appellent signe, mantisse (la partie qu´il appelle y), et exposant.
Sur le site suivant le nombre de bits alloués en fonction du type (float, double)
http://www.officieldunet.com/index.php?pid=327
Pour la multiplication des flottants, je ne suis pas experts, je ne pourrai pas répondre dans le détail... mais si quelqu´un a un bon site ! pareil pour le calcul des racines carrées
par contre, il me semble que les racines carrés sont beaucoup plus longues a calculer que le reste. Ainsi, pour les programmeurs, je vous invite a éviter les racines carrés tant que vous pouvez, surtout dans les zones ou la vitesse est critique.
Une astuce connue pour multiplier par 2 est de décaler tous les bits a droite. Pour diviser par 2, décalez tous les bits a gauche
(c´est pareil dans notre systeme de base 10 : pour multiplier par 10, vous décalez tout a droite (en ajoutant a 0 a la case nouvellement créée))