Code : Tout sélectionner
a.f = 21.3
b.f = 2.65
c.f = a-2*b
d.f = 16.0
If c = d
Debug "égal"
ElseIf d < c
Debug "inférieur"
ElseIf d > c
Debug "supérieur"
EndIf
Merci,
Bye
Code : Tout sélectionner
a.f = 21.3
b.f = 2.65
c.f = a-2*b
d.f = 16.0
If c = d
Debug "égal"
ElseIf d < c
Debug "inférieur"
ElseIf d > c
Debug "supérieur"
EndIf
Code : Tout sélectionner
a.f = 21.3
b.f = 2.65
c.f = a-2*b
d.f = 16.0
Fixed_c.f = StrF(c,5)
Fixed_d.f = StrF(d,5)
If Fixed_c = Fixed_d
Debug "égal"
ElseIf Fixed_c > Fixed_d
Debug "supérieur"
ElseIf Fixed_c < Fixed_d
Debug "Inferieur"
EndIf
Code : Tout sélectionner
a.d = 21.3
b.d = 2.65
c.d = a - (2 * b)
d.f = 16.0
If c = d
Debug "égal"
ElseIf d < c
Debug "inférieur"
ElseIf d > c
Debug "supérieur"
EndIf
Code : Tout sélectionner
a.f = 21.3
b.f = 2.65
c.f = a-2*b
d.f = 16.0
Debug c
Debug d
Eh oui, mais pour le comprendre il faut qu'il lise cette page de l'aide de PureBasic (tout en bas)Fred a écrit :C'est parce que c'est pas égal, tout simplement
Code : Tout sélectionner
a.f = 21.3 b.f = 2.65 c.f = a-2*b d.f = 16.0 Debug c Debug d
Code : Tout sélectionner
DisableDebugger
_Debug$ = ""
Macro IS_EGAL(nb1, nb2, intervalle)
(Abs(nb1 - nb2) <= intervalle * 1.1)
EndMacro
Macro IS_EGAL1(nb1, nb2, intervalle)
(nb1 - intervalle <= nb2) And (nb1 + intervalle >= nb2)
EndMacro
Macro IS_EGAL_STRING(nb1, nb2, nb_dec)
StrF(nb1, nb_dec) = StrF(nb2, nb_dec)
EndMacro
a.f = 21.3
b.f = 2.65
c.f = a-2*b
d.f = 16.0
_Debug$ + #CR$ + StrF(c)
_Debug$ + #CR$ + StrF(d)
If IS_EGAL(c, d, 0.01)
_Debug$ + #CR$ + "EGAL"
Else
_Debug$ + #CR$ + "Inégal"
EndIf
_Debug$ + #CR$ + ""
_Debug$ + #CR$ + "autre test"
_Debug$ + #CR$ + ""
c = 165.356
d = 165.355
_Debug$ + #CR$ + StrF(c)
_Debug$ + #CR$ + StrF(d)
If IS_EGAL(c, d, 0.001)
_Debug$ + #CR$ + "EGAL à 0,001 près"
Else
_Debug$ + #CR$ + "Inégal"
EndIf
If IS_EGAL1(c, d, 0.001)
_Debug$ + #CR$ + "EGAL à 0,001 près"
Else
_Debug$ + #CR$ + "Inégal"
EndIf
If IS_EGAL_STRING(c, d, 3)
_Debug$ + #CR$ + "EGAL à 3 decimales près"
Else
_Debug$ + #CR$ + "Inégal"
EndIf
If IS_EGAL(c, d, 0.0001)
_Debug$ + #CR$ + "EGAL à 0,0001 près"
Else
_Debug$ + #CR$ + "Inégal"
EndIf
nb = 1000000000
t = ElapsedMilliseconds()
For i = 0 To nb
If IS_EGAL(c, d, 0.0001)
Else
EndIf
Next
_Debug$ + #CR$ + "1 000 000 000 de tests : Macro : ABS() " + Str(ElapsedMilliseconds()-t)
t = ElapsedMilliseconds()
For i = 0 To nb
If IS_EGAL1(c, d, 0.0001)
Else
EndIf
Next
_Debug$ + #CR$ + "1 000 000 000 de tests : Macro : <= et >= " + Str(ElapsedMilliseconds()-t)
t = ElapsedMilliseconds()
For i = 0 To nb
If c = d
Else
EndIf
Next
_Debug$ + #CR$ + "1 000 000 000 de tests : référence " + Str(ElapsedMilliseconds()-t)
t = ElapsedMilliseconds()
For i = 0 To 1000000
If IS_EGAL_STRING(c, d, 3)
Else
EndIf
Next
_Debug$ + #CR$ + " 1 000 000 de tests : Macro : strf() " + Str(ElapsedMilliseconds()-t)
MessageRequester("", _Debug$)
Oui c'est un façon de voir les choses... Disons que "en informatique" cela n'est pas égal, mais pour le commun des mortels cela l'estFred a écrit :C'est parce que c'est pas égal, tout simplement
logiquement, je suppose que ton nombre "Rentre" dans un Double ..Torp a écrit :Par contre pourquoi le type double ne pose pas le même problème ?
Code : Tout sélectionner
Pour tester de manière fiable l'égalité en virgule flottante (dans n'importe quel format en virgule flottante binaire, telles que IEEE ou au Format binaire Microsoft), vous devez soustraire deux nombres à virgule flottante qui sont comparés et vérifier si leur différence est inférieure à une valeur dans les limites de leur importance pour simple ou double précision.