Page 1 sur 1

abs() pour nombre entier ?

Publié : jeu. 22/déc./2011 14:38
par blendman
salut

j'ai vu dans l'aide que abs() était réservé aux nombres flottant (f, d). Mais je ne trouve pas la fonction pour les entiers, savez-vous que c'est ?

Code : Tout sélectionner

Syntaxe

Resultat.f = Abs(Nombre.f)
Description

Renvoie la valeur absolue (non signée) de la valeur flottante spécifiée. Cette fonction ne peut être utilisée correctement qu'avec des nombres flottants. Si un entier est passé en argument et que sa valeur est grande une perte de précision sera constatée. Une autre fonction sera proposée au seul usage des valeurs entières. 

Re: abs() pour nombre entier ?

Publié : jeu. 22/déc./2011 15:13
par comtois
J'ai vu ça récemment sur le forum anglais
http://www.purebasic.fr/english/viewtop ... 12&t=48503

Re: abs() pour nombre entier ?

Publié : jeu. 22/déc./2011 15:36
par Mesa
Deux autres façons de faire :

Code : Tout sélectionner

Procedure.q ABS_I(Valeur.q)
  If valeur<0
    temp$=Str(valeur) ; transforme un entier en string
    tmp$=Right(temp$,Len(temp$)-1)  ; on enlève le signe - qui est le premier caractère
    ;tmp$=RemoveString(temp$, "-") 
    ProcedureReturn Val(tmp$) ; retransformation en entier ;ValQ(tmp$) est obsolète !?
  Else
    ProcedureReturn Valeur
    EndIf
  EndProcedure
  
 Procedure.q ABS_I2(Valeur.q) ; plus rapide ?
  If valeur<0
    temp.q=~valeur +1 ; complément à 2 = inversion de bit avec NOT "~" + 1
    ProcedureReturn temp 
  Else
    ProcedureReturn Valeur
    EndIf
  EndProcedure 
  
  
  ;Entier.q = ABS_I(-100000000000000001)
  Entier.q = ABS_I2(-892)

Debug Entier
Mesa.

Re: abs() pour nombre entier ?

Publié : jeu. 22/déc./2011 15:40
par brossden
Il est vrai que Abs(x) renvoie un flottant mais tu peux mettre un flottant dans un long !

Code : Tout sélectionner

a = -15
z.l = Abs(a)
Debug z ; retourne 15 et non 15.0
ou même avec des valeurs plus grandes

Code : Tout sélectionner

a.q = -25478118892525621
z.q = Abs(a)
Debug z
Debug a+z
tu veras que par la somme tu obtiens bien 0 ce qui signifie que la valeur est précise

Re: abs() pour nombre entier ?

Publié : jeu. 22/déc./2011 21:36
par Le Soldat Inconnu
@ Mesa, pourquoi si compliqué ?

Code : Tout sélectionner

Procedure Val2(Valeur.l)
	If Valeur < 0
		Valeur = -Valeur
	EndIf
	ProcedureReturn Valeur
EndProcedure

Re: abs() pour nombre entier ?

Publié : ven. 23/déc./2011 9:07
par Mesa
:lol: :oops:

Re: abs() pour nombre entier ?

Publié : ven. 23/déc./2011 11:11
par blendman
oki, merci beaucoup pour vos réponses, la procédure de LSi est pas mal, ainsi que la technique de Brossden :D.