Tronquer un nombre [Résolu]

Signaler
Messages postés
6
Date d'inscription
dimanche 26 octobre 2003
Statut
Membre
Dernière intervention
15 septembre 2004
-
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
-
Bonjour!

J'aimerais savoir comment on doit s'y prendre pour tronquer un nombre en assembleur?

ex : 5.12345 -> 5.12

Merci d'avance

5 réponses

Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
Je suppose donc que tu veux dire que tu veux 2 chiffres significatifs après la virgule.

Tu peux faire ta tronquature à 2 décimales en virgule fixe avec l'exemple que je t'ai donné, c'est à dire avec une précision de 5 décimales.
Il suffit de reprendre l'exemple que je t'ai donné mais de changer le diviseur. En effet, l'exemple que j'ai donné est une troncature à l'unité, pour obtenir une troncature à 2 décimales avec un diviseur de 1000 (= 100000 / 100)
mov ebx, 1000
mov eax, [num]
mov edx, 0
div ebx ; le résultat du modulo est dans edx
mov eax, [num]
sub eax, edx


Avec le fpu, la troncature à 2 décimales donne:
num dd 1235.12345
res dd 0 

...

; On modifie le mot de controle
; pour activer la troncature lors d'un FRNDINT
fldcw word ptr [res]
or byte ptr [res], 0Ch 
fstcw word ptr [res]

mov [res], 100.0
fld [res]
fld st
fld [num]
fmul
frndint
fdivr
fstp [res]


Core Breaker :)
Messages postés
569
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
6 janvier 2021
2
Salut,
une fois le nombre transformé en caracteres ascii , chercher le point ,compter le nombre de décimales voulues ,rajouter le zero de bout de chaine.
ToutEnMasm
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
Si ton nombre est en virgule fixe dans un entier comme ceci:
num dd 123512345

pour représenter le nombre 1235.12345 avec 5 chiffres après la virgule, il suffit de faire:
num / 100000 * 100000
ou num - (num modulo 10000)
ainsi:
mov ebx, 100000
mov eax, [num]
div eax, ebx
mul ebx

ou
mov ebx, 100000
mov eax, [num]
mov edx, 0
div ebx ; le résultat du modulo est dans edx
mov eax, [num]
sub eax, edx


Si ton nombre est en bcd compacté ainsi:
num db 45h, 23h, 51h, 23h, 01h

il suffit de placer des zéros ainsi
mov word ptr [num], 0
and byte ptr [num+2], 0F0h


Si maintenant tu utilise le fpu, ainsi
num dd 1235.12345
res dd 0


Il suffit de faire ainsi:
; On modifie le mot de controle
; pour activer la troncature lors d'un FRNDINT
fldcw word ptr [res]
or byte ptr [res], 0Ch 
fstcw word ptr [res]

fld [num]
frndint
fstp [res]


Core Breaker :)
Messages postés
6
Date d'inscription
dimanche 26 octobre 2003
Statut
Membre
Dernière intervention
15 septembre 2004

C'est cool,

Mais en fait, je me suis mal exprimé et je m'en excuse!

En fait, je dois trouver un algoritme faisable en assembleur pour convertir un nombre en un nombre à deux chiffres significatifs et j'ai vraiment aucune idée...
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
multiplie par 100
frndint
divise 100

ciao...
BruNews, Admin CS, MVP VC++