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

C Discussion :

µC 8bits => arrondir valeur (avis aux experts)


Sujet :

C

  1. #1
    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 µC 8bits => arrondir valeur (avis aux experts)
    bonjour,

    Je programme sur un µControlleur 8 bits (PIC18 de chez microchip) : mes ressources sont donc très limitées.

    Je dois arrondir au millier des valeurs qui sont entre 1 000 et 100 000 (donc stocké dans une variable de 4 octets) => ex : 1 024 => 1 000; 5 950 => 6 000.
    => une fois la valeur arrondi, je dois la diviser par 1 000 pour avoir mon résultat final => ex : 50 000 => 50.

    Quel est le meilleur algo pour faire mon arrondi ?

    Remarque : la valeur à arrondir est le résultat d'une multiplication d'un nombre K (compris entre 2 et 195) par 512. K ne prend pas n'importe quelle valeur : la valeur à arrondir est proche à ±2.5% (max) de la valeur arrondi (le résultat).

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Ma question va peut être paraître stupide, mais pourquoi arrondir avant de diviser? Ta division entière va de facto arrondir ta valeur?

  3. #3
    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
    parce que si tu fais (49 900 / 1000), tu auras comme résultat 49 au lieu de 50 (je ne travaille pas avec des virgules flottantes à cause de mon µC).

    Par contre au lieu de faire K * 512 / 1000, il est peut être plus judicieux de faire K / CONST avec CONST = 1000/512 = 1.953125 ...

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    (49000 + (1000/2)) / 1000 te donneras 49
    (49499 + (1000/2)) / 1000 te donneras 49
    (49500 + (1000/2)) / 1000 te donneras 50
    (49900 + (1000/2)) / 1000 te donneras 50
    (50499 + (1000/2)) / 1000 te donneras 50
    (50500 + (1000/2)) / 1000 te donneras 51

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Emcy Voir le message
    bonjour,

    Je programme sur un µControlleur 8 bits (PIC18 de chez microchip) : mes ressources sont donc très limitées.

    Je dois arrondir au millier des valeurs qui sont entre 1 000 et 100 000 (donc stocké dans une variable de 4 octets) => ex : 1 024 => 1 000; 5 950 => 6 000.
    => une fois la valeur arrondi, je dois la diviser par 1 000 pour avoir mon résultat final => ex : 50 000 => 50.

    Quel est le meilleur algo pour faire mon arrondi ?

    Remarque : la valeur à arrondir est le résultat d'une multiplication d'un nombre K (compris entre 2 et 195) par 512. K ne prend pas n'importe quelle valeur : la valeur à arrondir est proche à ±2.5% (max) de la valeur arrondi (le résultat).
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    #include <stdio.h>
    #define N(a)(sizeof(a)/sizeof*(a))
    int main (void)
    {
       unsigned long a[] = {
          1000,
          4999,
          5000,
          5001,
          49999,
          50000,
          50001,
          99999,
          100000,
       };
     
       {
          size_t i;
          for (i = 0; i < N (a); i++)
          {
             printf ("%8lu", a[i]);
          }
          printf ("\n");
       }
     
       {
          size_t i;
          for (i = 0; i < N (a); i++)
          {
             printf ("%8lu", a[i]/1000);
          }
          printf ("\n");
       }
     
       {
          size_t i;
          for (i = 0; i < N (a); i++)
          {
             printf ("%8lu", (a[i]+1)/1000);
          }
          printf ("\n");
       }
     
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        1000    4999    5000    5001   49999   50000   50001   99999  100000
           1       4       5       5      49      50      50      99     100
           1       5       5       5      50      50      50     100     100
     
    Process returned 0 (0x0)   execution time : 0.042 s
    Press any key to continue.

  6. #6
    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
    Emmanuel , il me semble que ton système ne fonctionne pas sur les nombres...

    la solution de ram-0000 est pour le moment la meilleure...
    ... cependant je me demande si ça ne serait pas plus simple de directement faire K / 1.953125 ça eviterait peut-être d'utiliser une variable de 4 octets et donc gagner en perf...

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Emcy Voir le message
    cependant je me demande si ça ne serait pas plus simple de directement faire K / 1.953125 ça eviterait peut-être d'utiliser une variable de 4 octets et donc gagner en perf...
    Là tu n'est plus en opération entière. En général, les perfs sont moins bonnes.

  8. #8
    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
    ok merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA-E]Avis aux experts, l'ouverture de fichier
    Par Masmeta dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/03/2007, 10h16
  2. Réponses: 4
    Dernier message: 03/02/2006, 11h06
  3. Réponses: 4
    Dernier message: 04/03/2005, 10h42
  4. Avis aux experts : accéder aux dimensions d'un tableau.
    Par poulpi dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 25/11/2004, 09h09
  5. avis aux experts-Quels sont les logiciels les plus adaptés??
    Par chouchouappc dans le forum Décisions SGBD
    Réponses: 46
    Dernier message: 20/07/2004, 21h26

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