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

Assembleur Discussion :

Stockage d'un nombre réel


Sujet :

Assembleur

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 14
    Points : 11
    Points
    11
    Par défaut Stockage d'un nombre réel
    bonjour.

    j'aimerais stocker un nombre lu au clavier et reel, dans une variable. J'arrive a lire le nombre en entier et a la stocker. Je stocke également le nb de chiffre après la virgule. Je me retrouve donc avec un entier disons de 5 chiffres (exemple : 34567) et une variable me disant qu'il y a 3 chiffres après la virgule. (pour donc en faire un reel tel que 34,567 en rapport avec l'exemple.)
    Seulement, je ne vois pas comment placer ,en quelque sorte, la virgule au bon endroit et convertir ce nombre entier en réel avec sa virgule...(pour par la suite la placer dans une variable)
    Peut-être que ma démarche est mauvaise, j'espère que non

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Il doit y avoir de la littérature sur le net pour ce genre de chose. Mais comme première approche vous pouvez demander au FPU une conversion :

    34,567 = 34567 * 10^(-3)

    Tout est faisable sans trop de difficulté, sauf peut être l'exposant :

    10^(-3) = 2^(-3 * log_2(10))

    Ce qui semple avoir été prévu, puisque log_2(10) existe en constante dans le FPU :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FLDL2T
     
    Push base-2 log of 10 onto stack
    Là, c'est plus facile, mais c'est pas encore gagné : l'exposant se fait soit pour un nombre entier, soit pour un nombre compris entre -1 et 1. Il vous faut donc faire une décomposition :

    -3 * log_2(10) = n + r

    Avec n entier et r compris entre -1 et 1. Cette décomposition n'est pas unique : tant mieux, vous pouvez utiliser n'importe quel des 3 arrondis (inférieur, supérieur, plus proche) pour trouver n :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FRNDINT
     
    Rounds ST from a real number to an integer. The rounding control (RC) field of the control word specifies the rounding method.
    Ensuite il vous reste :

    10^(-3) = 2^(n + r) = 2^n * 2^r


    Pour r :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    F2XM1
     
    Calculates Y = 2(^X) - 1 where X is taken from ST. The result, Y, is returned in ST. X must be in the range 0 <= X <= 0.5 on the 8087/287, or in the range -1.0 <= X <= +1.0 on the 80387/486.
    Vous devrez donc ajouter +1 en fin de calcul. Ensuite vous multiplierez directement le résultat par 2^n :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FSCALE
     
    Scales by powers of 2 by calculating the function Y = Y * 2^X. X is the scaling factor taken from ST(1), and Y is the value to be scaled from ST. The scaled result replaces the value in ST; the scaling factor remains in ST(1). If the scaling factor is not an integer, it will be truncated toward zero before the scaling. 
     
    On the 8087/287 processors, if X is not in the range -2^15 <= X < 2^15 or if X is in the range 0 < X < 1, the result will be undefined. The 80387/486 processors have no restrictions on the range of operands.

    Le reste ne sont que des multiplications. Le plus difficile est de comprendre comment organiser les instructions du FPU.


    Blustuff.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 32
    Points : 23
    Points
    23
    Par défaut
    Il y a un moyen astucieux :

    1=> Tu lis le nb comme si c'etait une chaines de caractère meme avec une virgule.

    2=> Tu parcours ta chaine et tu et tu convertit chaque carac en entier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
             mov ah,0
             mov al, chaine[i]
             mov entier, ax
    3=> Tu charges l'entier ds le fpu ,tu charge 10 ds le fpu
    et tu multiplie et tu additionne avec le carac suivant de la chaine
    Tu repete ca avec tte ta chaine en sautant la virgule(tu devra trouver le nb de chiffre derriere la virgule)
    ex : 12,2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            fild 1    ;1er carac
            fild 10  
            fmul    ;1*10 = 10
            fild 2
            fadd    ; 10+2 = 12
            fild 10  
            fmul    ;120
            fild 2
            fadd    ; 122
            fild 10
            fdiv     ; 122/10 = 12.2
    Voila

Discussions similaires

  1. arrondi d'un nombre réel
    Par KHEOPS1982 dans le forum Delphi
    Réponses: 6
    Dernier message: 17/06/2006, 20h22
  2. Affichage nombres réels
    Par ingelman dans le forum WinDev
    Réponses: 3
    Dernier message: 18/01/2006, 15h28
  3. Affichage des nombres réels!
    Par smail21 dans le forum Bases de données
    Réponses: 4
    Dernier message: 17/11/2005, 17h49
  4. Insertion d'un nombre réel dans une table
    Par mouloudéen dans le forum Langage SQL
    Réponses: 1
    Dernier message: 27/09/2005, 23h17
  5. Stocker un nombre réel
    Par julson dans le forum Assembleur
    Réponses: 2
    Dernier message: 01/04/2004, 08h59

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