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

Python Discussion :

convertir une valeur stocké sur 4 unsigned long en décimal


Sujet :

Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 5
    Points : 5
    Points
    5
    Par défaut convertir une valeur stocké sur 4 unsigned long en décimal
    Bonjour à tous,

    Je cherche de l'aide pour récupérer la valeur en décimal de 4 unsigned long stocké en base en python. Help !

    Voici la définition en IDL de mon type de donnée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    const 
    long Decimal_words = 4;
    typedef unsigned long Decimal_Data[Decimal_words];
    struct 
    Decimal
       {
         short sign;
         short scale;
         Decimal_Data words;
       };
    Dans ma doc d'aide, j'ai l'explication sur les 3 types :

    short sign
    The sign 0 means zero value > 0 means positive value < 0 means negative value.

    short scale
    The scale in decimal digits.

    Decimal_Data words
    Actual 32 bit words, least significant first This is the unsigned representation of the number.

    En regardant ici : http://www.astro.princeton.edu/~esir....html#wp671985
    Je constate que le unsigned long va de 0 à 2^32-1

    En faisant plusieurs essai pour rentrer des valeurs dans mon outil, voilà ce que j'obtiens en sortie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    4*294*967*297 = 2^32+1 -> sign=1, scale=4, words=[0L, 10000L, 0L, 0L]
    4*294*967*296 = 2^32   -> sign=1, scale=4, words=[10000L, 10000L, 0L, 0L]
    4 294 967 295 = 2^32-1 -> sign=1, scale=4, words=[4294957296L, 9999L, 0L, 0L]
    4 294 967 294 = 2^32-2 -> sign=1, scale=4, words=[4294947296L, 9999L, 0L, 0L]
    2 147 483 648 = 2^31   -> sign=1, scale=4, words=[0L, 5000L, 0L, 0L]
    1 073 741 824 = 2^30   -> sign=1, scale=4, words=[0L, 2500L, 0L, 0L]
    1 073 741 823 = 2^30-1 -> sign=1, scale=4, words=[4294957296L, 2499L, 0L, 0L]
        2 097 152 = 2^21   -> sign=1, scale=4, words=[3791650816L, 4L, 0L, 0L]
        1 048 577 = 2^20+1 -> sign=1, scale=4, words=[1895835408L, 2L, 0L, 0L]
        1 048 576 = 2^20   -> sign=1, scale=4, words=[1895825408L, 2L, 0L, 0L]
        1 048 575 = 2^20-1 -> sign=1, scale=4, words=[1895815408L, 2L, 0L, 0L]
            1 024 = 2^10   -> sign=1, scale=4, words=[10240000L, 0L, 0L, 0L]
    Maintenant en valeur négative
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    -3*135*012*625,55 -> sign=-1, scale=4, words=[1159961996L, 7299L, 0L, 0L]
    -3*135*012*624,09 -> sign=-1, scale=4, words=[1159947396L, 7299L, 0L, 0L]
    -3*135*012*623,36 -> sign=-1, scale=4, words=[1159940096L, 7299L, 0L, 0L]
    -1*567*506*312,41 -> sign=-1, scale=4, words=[2727460996L, 3649L, 0L, 0L]
    -1*530*767,88 -> sign=-1, scale=4, words=[2422776912L, 3L, 0L, 0L]
    En bref, j'ai du mal à construire la logique pour récupérer ma valeur de départ !
    Merci de votre aide.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 119
    Points : 139
    Points
    139
    Par défaut
    Bonjour,

    suivant la description, il me semble que le code suivant devrait faire l'affaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    import decimal
    def f(sign,scale,words):
        dec=decimal.Decimal(0)
        for i,w in enumerate(words):
                dec+=w*2**(32*i) # least significant first
        if sign<0: dec=-dec
        if sign==0: dec=dec
        dec/=10**scale
        return dec

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Merci
    Oui, cela fonctionne à merveil !
    Merci beaucoup !

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 119
    Points : 139
    Points
    139
    Par défaut
    Super. Attention quand même, je viens de voir que j'avais fait une typo:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if sign==0: dec=0 # et non dec=dec

Discussions similaires

  1. Peut t'on faire une procedure stocké sur access ?
    Par Solero dans le forum Access
    Réponses: 6
    Dernier message: 28/01/2019, 10h33
  2. [TAG] Convertir une valeur numérique en hh:mm:ss
    Par Rafiki dans le forum Taglibs
    Réponses: 6
    Dernier message: 09/06/2006, 13h21
  3. Lire une vidéo stockée sur serveur distant
    Par zoidy dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 22/05/2006, 13h38
  4. Convertir une valeur d'une zone de texte en date
    Par os_rasta dans le forum ASP
    Réponses: 17
    Dernier message: 27/02/2006, 15h56
  5. test d'une valeur stocké dans une table
    Par EssaiEncore dans le forum ASP
    Réponses: 3
    Dernier message: 18/02/2005, 11h39

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