abs() pour nombre entier ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

abs() pour nombre entier ?

Message 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. 
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: abs() pour nombre entier ?

Message par comtois »

J'ai vu ça récemment sur le forum anglais
http://www.purebasic.fr/english/viewtop ... 12&t=48503
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: abs() pour nombre entier ?

Message 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.
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Re: abs() pour nombre entier ?

Message 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
Denis

Bonne Jounée à tous
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: abs() pour nombre entier ?

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: abs() pour nombre entier ?

Message par Mesa »

:lol: :oops:
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: abs() pour nombre entier ?

Message par blendman »

oki, merci beaucoup pour vos réponses, la procédure de LSi est pas mal, ainsi que la technique de Brossden :D.
Répondre