Demander que mon programme reconnaise les chiffres avec et sans virgule ### (SVP

Sojojo Messages postés 41 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 7 septembre 2005 - 31 mai 2005 à 11:18
Sojojo Messages postés 41 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 7 septembre 2005 - 31 mai 2005 à 16:33
J'aimerais savoir s'il est possible de faire reconnaitre au programme les chiffres avec et sans virgules.
Car, si j'ai un chiffre sas virgules, je n'est pas besoin d'effectué quelques opérations et s'il y a des virgules, je dois le transformer en décimal sans virgule.
J'aimerais aussi savoir qu'est_ce que c'est réellement la norme IEEE (le truc qui permet de calculer les nombres a virgules).
Quelqu'un peut me dire aussi si se que j'ai fait est correcte pour transformer les nombres a virgules?
Ce que j'ai fait pour les chiffres a virgule c'est:
trouver l'exposant, le signe et la mantisse (tout en binaire) et je retransforme en decimal.

18 réponses

cs_ITALIA Messages postés 2169 Date d'inscription vendredi 20 avril 2001 Statut Membre Dernière intervention 30 juin 2009 9
31 mai 2005 à 11:45
Essayes la Fonction CLng()

It@li@
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
31 mai 2005 à 11:57
Italia a un peu raison, en ce sens que Vb fait très bien la conversion lui même.

mais je comprend très bien qu'il est intéressant de comprendre comment est codé un nombre en virgule flottante.

mais comment vérifier qu'on a raison et que le calcul est bon ?

le seul moyen de vérifier est d'aller voir le résultat trouvé par Vb lui-même.

(utilise RtlMoveMemory pour ça)

je te conseille une source de CanisLupus:

http://www.vbfrance.com/code.aspx?ID=23026



(désolé le créateur de Lien marche plus ??? )



contrairement a ce que j'avais dis à l'époque, il y a des erreurs dans
le calcul des derniers bits, bien sûr c'est toujours Vb qui a raison,
ceci est dû aux erreurs de calculs et au tronquage du Double.


Daniel
0
cs_dragon Messages postés 2336 Date d'inscription samedi 14 juillet 2001 Statut Membre Dernière intervention 5 mai 2009 6
31 mai 2005 à 12:34
moi j'ai souvent fait

if int(chiffre) = chiffre then
pas de virgule
else
virgule présente
end if


-------------------------------------------------
Dragon alias aussi Waxime mais bon, pas le gout de refaire un nouveau profil lol
-------------------------------------------------
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
31 mai 2005 à 12:55
Int() va se planter si ça dépasse la capacité.

de même avec CLng()

de plus le problème d'arrondi va entraîner des erreurs.





Dim n As Double



n = 111222333444556# 'avec virgule ????





If Fix(n) = n Then

MsgBox "sans virgule"

Else

MsgBox "avec virgule"

End If



MsgBox Fix(n) - n


Daniel
0

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

Posez votre question
Sojojo Messages postés 41 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 7 septembre 2005
31 mai 2005 à 13:02
moi la je devient un peu perdu
en plus je crois ke j'ai réussi a faire quelque chose mais, je n'arrive pas a modifer les valeurs des paramètres de mon variateur (pasque c ca que je dois faire....).
mon problème c les chiffres float paske je sais pas trop comment ca marche, j'ai réussi a avoir pour la valeur 50.5 -> 1112067276 mais apèrs mon variateur veut pas le prendre et pourtant normalemen c se que je dois avoir
après si mon variaeur veut pas changer la valeur ca ne relève plus du langage vb ...
o pire si quelqu'un peuuuut m'aiiderr
merci
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
31 mai 2005 à 13:27
c'est quoi variateur ?

et ce nombre 1112067276 correspond à quoi ?



sinon 50,5 en IEEE 754 est codé comme ça:

&H4049400000000000


Daniel
0
Sojojo Messages postés 41 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 7 septembre 2005
31 mai 2005 à 14:06
1112067276, c'est la valeur que je trouve avec la norme IEEE.
j'explique:
je rentre la valeur 50.5
je calcule le signe l'exposant et la mantisse.
tout ca c sur des bits précis
bit(31) 0 >signe (signe positif)bit(30) à bit(23) 10000100 >exposant (je suis pas sur ke ce soit pour la valeur 50.5)bit(22) à bit(0) 100000....> mantisse

ensuite je fait
for i = 31 to 0
nombre = nombre + Bit(i)*2^i
et la je trouve 1112067276

Il est possible ke ce que je fasse ne tienne pas du tout la route, pour moi en faisant ca je suis retourné a une valeur décimale sans virgule correspondant a 50.5
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
31 mai 2005 à 14:46
ok je pense que c'est parce que je suis en Double.

j'ai ça:


Signe --> 0

Exposant --> 10000000100

Mantisse --> 1001010000000000000000000000000000000000000000000000


Daniel
0
Sojojo Messages postés 41 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 7 septembre 2005
31 mai 2005 à 14:57
ouais ben la on est entièrement d'accord je trouve pareil donc après je le retransforme en decimal avec :
for i = 31 to 0
nombre = nombre + Bit(i)*2^i
et nombre = 1112067276
ca c juste ou c totalement faut.???
parce que si ca c'est bon ca veu dire que mon envoie de telegramme au variateur n'est pas bon mais pourtant il fonctionne avec les variable sans virgules ... Bizzzzard ...
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
31 mai 2005 à 15:00
je pense que tu as une erreur dans la mantisse:

10010100000000000000000



ce qui donne --> 1112145920

Daniel
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
31 mai 2005 à 15:08
comment je calcule ça



50.5 / 32 - 1 --> 0.578125





0.5000000 bit 22 = 1

0.0625000 bit 19 = 1

0.0156250 bit 17 = 1

Daniel
0
Sojojo Messages postés 41 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 7 septembre 2005
31 mai 2005 à 15:20
toi tu est sur 64 bits?
moi mon signe mopn exposant et ma mantisse sont sur 32 bits
ca change bcp?
0
Sojojo Messages postés 41 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 7 septembre 2005
31 mai 2005 à 15:38
je suis d'accord avec toi c ce que je trouve ausii
Bit(30) = 1
Bit(25) = 1
Bit(22) = 1
Bit(19) = 1
Bit(17) = 1
et tous les autres sont a zéro et je suis sur 32 bits
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
31 mai 2005 à 15:44
j'ai adapté le programme vite fait.

de 1 + 11 + 52 (1023 pour exposant)

à 1 + 8 + 23 (127 pour exposant)



et je retrouve le même que Vb

Daniel
0
Sojojo Messages postés 41 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 7 septembre 2005
31 mai 2005 à 15:51
Ca représente quoi tout ca !! svp
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
31 mai 2005 à 15:58
Pourquoi tu laisses pas faire les calculs par VB

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)





Dim V As Single

Dim B() As Byte



' valeur d'entrée dans text1.text

V = CSng(Text1.Text)

ReDim B(3)

CopyMemory B(0), V, 4

' résultat dans text2.text

Text2.text = B(3) * 16777216 + B(2) * 65536 + B(1) * 256 + B(0)


Daniel
0
Sojojo Messages postés 41 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 7 septembre 2005
31 mai 2005 à 16:11
ben je veu bien mais je declare :
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

après option explicit
et je mets
Dim V As Single
Dim B() As Byte


' valeur d'entrée dans text1.text
V = CSng(Text1.Text)
ReDim B(3)
CopyMemory B(0), V, 4

' résultat dans text2.text
Text2.text = B(3) * 16777216 + B(2) * 65536 + B(1) * 256 + B(0)

a l'endroit ou je veu dans ma feuille
mais j'ai un message d'erreur : "erreur de compilation : fonction procédure ou sub non defini" et j'ai CopyMemory qui et surligné
0
Sojojo Messages postés 41 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 7 septembre 2005
31 mai 2005 à 16:33
non c bon ca marche g parlé trop vite mais ca me donne quand meme la valeur (1112145920) que j'avais avant.... en mins long, ok en moin risqué, ok
0
Rejoignez-nous