Tronquer un nombre

Résolu
leclair2000 Messages postés 6 Date d'inscription dimanche 26 octobre 2003 Statut Membre Dernière intervention 15 septembre 2004 - 6 sept. 2004 à 08:45
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 - 7 sept. 2004 à 22:43
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

CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
7 sept. 2004 à 22:43
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 :)
3
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
6 sept. 2004 à 09:16
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
0
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
6 sept. 2004 à 23:47
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 :)
0
leclair2000 Messages postés 6 Date d'inscription dimanche 26 octobre 2003 Statut Membre Dernière intervention 15 septembre 2004
7 sept. 2004 à 09:57
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...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 sept. 2004 à 11:43
multiplie par 100
frndint
divise 100

ciao...
BruNews, Admin CS, MVP VC++
0
Rejoignez-nous