J’y travaille
c’est pourtant juste des maths, j’ai pas été clair :ane:, bon c’est plus simple avec le code
[codebox]
Public Sub cDoubleToLong()
Dim l As Long
Dim h As Long
Dim x As Double
'5 milliards
x = 5000000000#
MsgBox “x=” & x
l = x / (4294967296#)
MsgBox “l=” & l
h = x - (l * 4294967296#)
MsgBox “h=” & h
End Sub
[/codebox]
ça , ça marche
mais c’est avec des opérations sur flottants: tu fait les division en mode double, et tu stocke dans du long, ça te converti en entier.
Je travaille à la méthode bit à bit, mais comme je disais, ça dépend de la représentation machine et pour illustrer cela, j’utilise ce code
[codebox]
Public Declare Sub CopyMemory Lib “kernel32” Alias “RtlMoveMemory” (Destination As Any, Source As Any, ByVal Length As Long)
Public Type LARGE_INTEGER
lngLow As Long
lngHigh As Long
End Type
Public Sub cDoubleToLongBits()
’ en Double : Signe Exposant Mantisse = 1 bit 11 bits 52 bits
Dim l As Long
Dim h As Long
Dim x As Double
Dim bytes As LARGE_INTEGER
'5 milliards
'x = 5000000000#
x = 5
'x = 1
Call CopyMemory(bytes, x, 8)
MsgBox “x=” & x
'j’affiche les bytes pour comprendre le fonctionnement
MsgBox “b1=” & bytes.lngLow
MsgBox "b2=" & bytes.lngHigh
End Sub
[/codebox]
et en exécutant ça, on obtien le résultat suivant:
[codebox]
---- résultat:
Soit x=1
le byte b2=1072693248 soit en binaire:
00111111111100000000000000000000
décomposition des bits
s e m 1 11 52
S
eeeeeeeeeee
mmmmmmmmmmmmmmmmmmmm
00111111111100000000000000000000
01234567890123456789012345678901
x vaut 1 car (-1)^s*(1+m)+2^(e-1023) =
(-1)^0*(1+0)*2^(1023 - 1023) = 1
note e= 1111111111binaire = 1023 décimal
soit x=5
b2=1075052544
S
eeeeeeeeeee
mmmmmmmmmmmmmmmmmmmm
01000000000101000000000000000000
e=1025
m=0.25 (0.01 en binaire)
x vaut 5 car (-1)^s*(1+m)+2^(e-1023) =
(-1)^0*(1+0.25)*2^(1025 - 1023) = (1.25).2^2
note e= 10000000001binaire = 1023 décimal
[/codebox]
on voit que la représentation d’un simple “1” est une valeur:
signe=0
exposant=1111111111 en binaire (implicitement 1023 - cette valeur)
mantisse= 000000000 en binaire (implicitement 1+ cette valeur)
il y a un peu de travail à faire pour s’y retrouver, si j’ai du temps je m’y replonge, mais sinon, tu as la méthode “flottante” qui marche très bien