problème avec les réels et les opérations

Archive.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

problème avec les réels et les opérations

Message par Dr. Dri »

là j'avoue ne pas comprendre :lol:

Code : Tout sélectionner

a.f = Pow(2, 32)
Debug a
Debug a - 1.0
Debug a + 1.0
Dri
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

C'est à cause du système de la virgule flottante :wink:
si tu met a + 1000, là il y aura une différence, qui sera sans doute mauvaise, mais bon.
C'est la même chose que qd on essaye de coder PI : 3.1415916... La valeur va être modifier selon le codage (les puissnaces de 2..)

J'espère être assez clair. :?
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

mais là le nombre va bien jusqu'aux unités nan ?

Dri
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Bah non, pas forcément.
Etend donné que tu peut coder un nombre extrémenet grand comme extrément petit tu es limité :
Le codage s'effactue de la sorte : (en 32 bits)
* 1 bit pour le signe
* 8 bits pour l'exposant
* 23 bits pour la mantisse

Donc on a 23 bits pour la précisions (le bit du signe ne limitant rien)(les bits de l'exposant servant juste à définir la taille de la plage supportée).

Je vais essayé de te faire un exemple...
Lis ça en attendanat sinon : http://www.mines.inpl-nancy.fr/~tombre/ ... fo015.html
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

J'arrive pas à voir les bits des float ... :?
J'y arrive avec les bytes/words/longs, ms pas avec les float :

Code : Tout sélectionner

Procedure.s ByteToBin(b.b)
  Protected s.s, i.b, pow.b
  
  s = "00000000"
  For i = 0 To 7
    pow = Pow(2,i)
    If b & pow
      PokeB(@s + (7-i), Asc("1"))
    EndIf
  Next
  ;Debug s
  ProcedureReturn s

EndProcedure


Procedure.s LongToBin(l.l)
  Protected s.s, i.w, pow.l
  
  s = "00000000000000000000000000000000"
  For i = 0 To 31
    pow = Pow(2,i)
    If l & pow
      PokeB(@s + (31-i), Asc("1"))
    EndIf
  Next
  ;Debug s
  ProcedureReturn s

EndProcedure



;a.f = Pow(2, 32)
;Debug a

a.l = 32767

Debug "Conversion de " + Str(a)
s.s
For i = 0 To 3
  s = ByteToBin(PeekB(@a + i)) + s
Next i

Debug s

Debug LongToBin(a)


; ***********************
; *   Partie Float !!!  *
; ***********************

; -------------------------- BUG !!! ------------------------


Debug " --- "

b.f = Pow(2,32)
Debug b

s = ""
For i = 0 To 3
  s = ByteToBin(PeekB(@b + i)) + s
Next i
Debug s



b.f = -13.125
Debug b

s = ""
For i = 0 To 3
  s = ByteToBin(PeekB(@b + i)) + s
Next i
Debug s


b.f = 1
Debug b

s = ""
For i = 0 To 3
  s = ByteToBin(PeekB(@b + i)) + s
Next i
Debug s


b.f = -1
Debug b

s = ""
For i = 0 To 3
  s = ByteToBin(PeekB(@b + i)) + s
Next i
Debug s
Il me met toujours els 16 derniers bits à "0", alors que les float PB sont bien sous 32 bits !!!
Bizarre, à moins que j'ai loupé qqchose !!!? :roll:
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

pour voir les bits d'un Float, lis le comme un Long, ca doit être simple comme ca nan ?

Code : Tout sélectionner

*ptr.Long = @var.f
var = Pow(2, 32)
Debug Bin(*ptr\l)
Dri
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Non marche pas comme ça ! :cry:
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

Code : Tout sélectionner

Procedure.s Debug_Float32(Address.f)
  Sign.l = PeekL(@Address) & $80000000
  If Sign : Sign = -1 : Else : Sign = 1 : EndIf
  Exponant.l = PeekL(@Address) & $07F80000
  Exponant.l = Exponant >> 23
  Mantissa.l = PeekL(@Address) & $007FFFFF
  Mantissa_Copy.l = Mantissa
  ProcedureReturn RSet(Hex(PeekL(@Address)), 8, "0") + " Sign : " + Str(Sign) + " Exponant : " +  RSet(Hex(Exponant), 2, "0") + " Mantissa : " + RSet(Hex(Mantissa), 6, "0")
EndProcedure

  fValue.f
  fValue = 0.0 : Debug StrF(fValue, 10) + " " + Debug_Float32(fValue)
  fValue = 1.0 : Debug StrF(fValue, 10) + " " + Debug_Float32(fValue)
  fValue = 2.0 : Debug StrF(fValue, 10) + " " + Debug_Float32(fValue)
  fValue = 3.14159265 : Debug StrF(fValue, 10) + " " + Debug_Float32(fValue)
  fValue = -3.14159265 : Debug StrF(fValue, 10) + " " + Debug_Float32(fValue)
  fValue = 31.4159265 : Debug StrF(fValue, 10) + " " + Debug_Float32(fValue)
  fValue = 31415.9265 : Debug StrF(fValue, 10) + " " + Debug_Float32(fValue)
  
End
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

:10:

Ce qui donne :

Code : Tout sélectionner

Procedure.s FloatToBin(Address.f)
  Protected Exponant.l, Mantissa.l, s.s, i.b, pow.l

  s = "00000000000000000000000000000000"
  If PeekL(@Address) & $80000000
    PokeB(@s, Asc("1"))
  EndIf
  
  Exponant.l = PeekL(@Address) & $07F80000
  Exponant.l = Exponant >> 23
  For i = 0 To 7
    pow = Pow(2,i)
    If Exponant & pow
      PokeB(@s + (8-i), Asc("1"))
    EndIf
  Next
  Mantissa.l = PeekL(@Address) & $007FFFFF
  For i = 0 To 20
    pow = Pow(2,i)
    If Mantissa & pow
      PokeB(@s + (31-i), Asc("1"))
    EndIf
  Next

  ProcedureReturn s
EndProcedure
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message par fweil »

lionel_om,

A 1 bit près.

Mais si c'est juste pour afficher les bits de la mantisse, il y a plus simple (Valeur est un flottant bien entendu) :

Debug RSet(Bin(PeekL(@Valeur) & $007FFFFF), 23, "0")
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Oula, en fait c'était tout simple :

Code : Tout sélectionner

Procedure.s ByteToBin(b.b)
  Protected s.s, i.b, pow.b
  
  s = "00000000"
  For i = 0 To 7
    pow = Pow(2,i)
    If b & pow
      PokeB(@s + (7-i), Asc("1"))
    EndIf
  Next
  ;Debug s
  ProcedureReturn s

EndProcedure


Procedure.s LongToBin(l.l)
  Protected s.s, i.w, pow.l
  
  s = "00000000000000000000000000000000"
  For i = 0 To 31
    pow = Pow(2,i)
    If l & pow
      PokeB(@s + (31-i), Asc("1"))
    EndIf
  Next
  ;Debug s
  ProcedureReturn s

EndProcedure


Procedure.s FloatToBin(f.f)
  ProcedureReturn LongToBin(PeekL(@f))
EndProcedure
:10: ???
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

c'est pas ce ke je t'avais suggéré au-dessus ?

Dri tusors:
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

J'suis vraiment un boulet !!!
:jesors: :0:
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Répondre