IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Mathématiques Discussion :

µC 8 bit => optimisation multiplication par 2.833


Sujet :

Mathématiques

  1. #21
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    La methode est bonne. C'est juste qu'il faut utiliser un buffer de 16 bits pour le calcul et ne pas "tronquer" les chiffres de droite lors des décalages de bits.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    1234 * 2.833 <=> 10011010010 * 10.1101010100111111
     
                         ---  16bits  ---
                         1234567890123456
    --------------------------------------
    10011010010 << 1  =  10011010010     | 39488
    10011010010 >> 1  =    10011010010   | 9872
    10011010010 >> 2  =     10011010010  | 4936
    10011010010 >> 4  =       1001101001 | 1234
    10011010010 >> 6  =         100110100| 308
    10011010010 >> 8  =           1001101| 77
    10011010010 >> 11 =              1001| 9
    10011010010 >> 12 =               100| 4
    10011010010 >> 13 =                10| 2
    10011010010 >> 14 =                 1| 1
    10011010010 >> 15 =                  | empty -> stop
     
    Total             =  1101101001111011
    Division par 16   =  110110100111.1011 = 3495.6875
    => j'avais bien compris le fait de faire le decallage avant de faire le traitement : c'est ce que j'ai fait dans la deuxieme solution de mon avant dernier poste (a part que je n'ai utilisé que 12 bit au lieu de 16).
    => la precision du resultat depend donc de la taille du buffer utilisé ... le problème est que je vois comment pour faire calculer la précision du résultat


    scr, je ne vois pas pourquoi diviser par 6 simplifie les choses (ce n'est pas un multiple de puissance de 2). De plus avec ta solution, cela imposse d'avoir un buffer de taille plus grande (car au depart, tu multiplies par 17 au lieu de 2 avec l'autre solution => si le resultat peut etre contenu dans le buffer, alors on peut forcement faire le calcul; ce qui n'est pas le cas avec ta solution)...

  2. #22
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par Emcy Voir le message
    c'est ce que j'ai fait dans la deuxieme solution de mon avant dernier poste
    Oui, tout a fait. Mon post etait en réponse a celui de scr et son exemple de calcul "n=1".
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #23
    scr
    scr est déconnecté
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 127
    Points : 143
    Points
    143
    Par défaut
    ok d'accord et merci pour ces explications
    si j'ai bien tout compris il faut:
    - utiliser un buffer 16 bits au lieu de 8 pour le calcul
    - prétraiter le résultat en le multipliant par 16

    pour ce qui est de la solution en multipliant par 17 et divisant par 6, et ben oui on multiplie par 17 et cela risque de déborder du buffer mais dans l'autre on multiplie bien par 16

    pour ce qui est de l'erreur a mon avis elle est au maximum a la valeur du dernier bit du buffer soit 1/16 si on prétraite le résultat en le multipliant par 16 (en négligeant l'erreur faite sur le codage en format binaire du mutiplicateur)

  4. #24
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par scr Voir le message
    ok d'accord et merci pour ces explications
    si j'ai bien tout compris il faut:
    - utiliser un buffer 16 bits au lieu de 8 pour le calcul
    - prétraiter le résultat en le multipliant par 16
    Heu... non. On ne fait pas de pré-multiplication par une constante.

    La division par 16 dans mon exemple vient du fait que le nombre "1234" fait 11 bits de long et que le multiplieur "2.833" necessite un décalage de 1 bit a gauche. Comme le buffer fait 16 bits, les nombres binaires sont décalés de 16-(11+1)=4 bits à gauche. Donc a la fin, il faut faire un décalage de 4 bits a droite (d'ou la division par 2^4=16).

    Le décalage final a effectuer est: TailleBuffer - (TailleNombre + DécalageMax)

    Exemple pour "n=1":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    1 * 2.833 <=> 1 * 10.1101010100111111
     
               ---  16bits  ---
               1234567890123456
    ----------------------------
    1 << 1  =  1               | 32768
    1 >> 1  =    1             | 8192
    1 >> 2  =     1            | 4096
    1 >> 4  =       1          | 1024
    1 >> 6  =         1        | 256
    1 >> 8  =           1      | 64
    1 >> 11 =              1   | 8
    1 >> 12 =               1  | 4
    1 >> 13 =                1 | 2
    1 >> 14 =                 1| 1
    1 >> 15 =                  | empty -> stop
    ----------------------------
    Total   =  1011010101001111 = 46415
     
    Shift = 16-(1+1) = 14 
     
    Résult (binaire) = 10.11010101001111 
    Résult (decimal) = 46415 / 2^14 = 2.83294677734375
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #25
    scr
    scr est déconnecté
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 127
    Points : 143
    Points
    143
    Par défaut
    ok, quand je disais multiplier par 16 je sous entendais decage de bits mais encore merci pour ces precisions, je n'avais pas vu qu'en plus le decalage était paramétré en fonction de la taille de la valeur a multiplier.

    je suppose que l'intérêt de cette solution est sa rapidité d'execution par rapport à une multiplication puis une division ?

    en tout cas multiplier par 16 et faire un décalage de 4 bits, le résultat est le même on risque de deborder du buffer de 4 bits...

  6. #26
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par scr Voir le message
    je suppose que l'intérêt de cette solution est sa rapidité d'execution par rapport à une multiplication puis une division ?
    C'est surtout que c'est un algo simple pour multiplier deux décimaux sans passer par la représentation IEEE 754.

    en tout cas multiplier par 16 et faire un décalage de 4 bits, le résultat est le même on risque de deborder du buffer de 4 bits...
    Oui, au pire tu va déborder de 1 bit (a gauche) lors de l'addition et obtenir un résultat sur 17 bits.

    Tu peux détecter ce cas au moment de l'addition et faire un décalage de 1 bit a droite de tout le buffer pour te retrouver sur 16 bits (penser a réduire de 1 le shift final).
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  7. #27
    scr
    scr est déconnecté
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 127
    Points : 143
    Points
    143
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    C'est surtout que c'est un algo simple pour multiplier deux décimaux sans passer par la représentation IEEE 754.
    C'est pas l'algorithme utilisé par le processeur d'ailleur ?

    Citation Envoyé par pseudocode Voir le message
    Oui, au pire tu va déborder de 1 bit (a gauche) lors de l'addition et obtenir un résultat sur 17 bits.
    Tu peux détecter ce cas au moment de l'addition et faire un décalage de 1 bit a droite de tout le buffer pour te retrouver sur 16 bits (penser a réduire de 1 le shift final).
    Oui effectivement,
    Dans ce cas la ne vaut il pas mieux prevoir un bit de sécurité dans le buffer quite a perdre un bit de précision ? Que ferait le processeur ?

  8. #28
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par scr Voir le message
    C'est pas l'algorithme utilisé par le processeur d'ailleur ?
    Dans les FPU on multiplie généralement des flottants en représentation IEEE 754. Il sont donc normalisés et on n'a pas besoin de faire de décalage durant la phase de multiplication des mantisses. Par contre il faut faire un décalage après la multiplication pour normaliser le résultat.

    http://meseec.ce.rit.edu/eecc250-win...-1-27-2000.pdf

    Dans ce cas la ne vaut il pas mieux prevoir un bit de sécurité dans le buffer quite a perdre un bit de précision ? Que ferait le processeur ?
    Si c'est une FPU (qui gere les flottants) elle s'occupe de tout. Sinon, les ALU signalent les problèmes dans un registre d'état (bit d'overflow, de retenu, de division par zero, ...). Il suffit de tester ce registre a la fin de l'addition pour savoir s'il y a eu dépassement et ainsi faire le décalage nécéssaire...

    http://en.wikipedia.org/wiki/Arithme...ts_and_outputs
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  9. #29
    scr
    scr est déconnecté
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 127
    Points : 143
    Points
    143
    Par défaut
    Ok et encore merci pour ces précisions

  10. #30
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par scr Voir le message
    Ok et encore merci pour ces précisions
    De rien... c'etait un plaisir
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. optimisation décalage par rapport à multiplication
    Par ft1103 dans le forum Embarqué
    Réponses: 4
    Dernier message: 08/04/2013, 21h30
  2. Optimisation MySQL par division dans plusieurs tables
    Par John_attend dans le forum Requêtes
    Réponses: 4
    Dernier message: 13/01/2008, 12h14
  3. [MySQL] Une simple multiplication par 1000 !
    Par Christophe Charron dans le forum PHP & Base de données
    Réponses: 19
    Dernier message: 23/09/2007, 12h34
  4. multiplication par regroupement
    Par Alexandr dans le forum Access
    Réponses: 3
    Dernier message: 28/07/2006, 11h54
  5. Multiplication par décalage de bits
    Par tekman54000 dans le forum Assembleur
    Réponses: 2
    Dernier message: 25/10/2005, 11h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo