Page 1 sur 1

ABS ...

Publié : jeu. 08/nov./2012 14:26
par jerexgrz
Une petite commande pour avoir des valeurs absolues pour les entiers !!

Re: ABS ...

Publié : jeu. 08/nov./2012 15:06
par Ar-S
Un truc comme ça ?

Code : Tout sélectionner

Procedure.i Abso(Valeur)
  Protected AbsVal
  If valeur < 0
    AbsVal = Val (RemoveString(Str(valeur),"-"))
  Else
    AbsVal = Valeur
  EndIf  
  ProcedureReturn Absval
  
EndProcedure

  

a = 1250
b = -45322
c = -28

Debug Abso(a)
Debug Abso(b)
Debug Abso(c)

Re: ABS ...

Publié : jeu. 08/nov./2012 18:15
par Golfy
Pourquoi ne pas utiliser int() ?

Code : Tout sélectionner

Debug Abs(-5)        --> 5.0 
Debug Int(Abs(-5))   --> 5

Re: ABS ...

Publié : jeu. 08/nov./2012 18:27
par Ar-S
Golfy a écrit :Pourquoi ne pas utiliser int() ?

Code : Tout sélectionner

Debug Abs(-5)        --> 5.0 
Debug Int(Abs(-5))   --> 5
j'utilise tellement peu cette fonction que je l'avais zappé. :P

Re: ABS ...

Publié : jeu. 08/nov./2012 19:16
par Mindphazer
Ar-S a écrit :

Code : Tout sélectionner

    AbsVal = Val (RemoveString(Str(valeur),"-"))
Heu....

Code : Tout sélectionner

AbsVal = -valeur 
C'est pas plus simple ?

Re: ABS ...

Publié : jeu. 08/nov./2012 19:32
par graph100
Aide de Purebasic a écrit :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 ...

Publié : jeu. 08/nov./2012 19:42
par Ar-S
Certes 8)

Re: ABS ...

Publié : ven. 09/nov./2012 9:45
par Golfy
graph100 a écrit :
Aide de Purebasic a écrit :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.
C'est pas faux ! 8O

Code : Tout sélectionner

Debug -9876543210123456789.9
Debug Abs(-9876543210123456789.9)
Debug Int(Abs(-9876543210123456789.9))
;
Debug -987654321012345678.9
Debug Abs(-987654321012345678.9)
Debug Int(Abs(-987654321012345678.9))
renvoit

Code : Tout sélectionner

8570200863586095100.0
8570200863586095100.0
8570200863586095104
;
-987654321012345730.0
987654321012345730.0
987654321012345728
Un effet du debug ?

Re: ABS ...

Publié : ven. 09/nov./2012 16:17
par graph100
bah tu as n'as pas utilisé des entiers !!!

Je t'invite à lire la doc concernant l'utilisation des nombres à virgules flottantes de précision simple et double
c'est dans les Thèmes généraux > Variables, Types et Opérateurs.

Re: ABS ...

Publié : dim. 11/nov./2012 13:22
par Le Soldat Inconnu
et tout simplement

Code : Tout sélectionner

Valeur.q = -12
AbsValeur.q = Abs(Valeur)
Debug AbsValeur
Parce que un Int() c'est lent. A utiliser que si nécessaire

Re: ABS ...

Publié : dim. 11/nov./2012 22:40
par Golfy
graph100 a écrit :bah tu as n'as pas utilisé des entiers !!!

Je t'invite à lire la doc concernant l'utilisation des nombres à virgules flottantes de précision simple et double
c'est dans les Thèmes généraux > Variables, Types et Opérateurs.
Oui, c'est vrai j'ai poussé le bouchon un peu loin :oops:
Et même si je suis en 64 bits (mes int sont donc sur 8 oct.) j'ai dépassé la valeur (en gros, 19 chiffres).

Pour l'URL, pour la page des variables, j'y passe plusieurs fois par semaine (car j'oublie les différences entre .a, .c par exemple et pleins d'autres problèmes comme .d <> .f ou quels sont les signé et non-signés)

je reste cependant sur ma fin avec le code suivant :

Code : Tout sélectionner

a.q = -987654321012345678.2
b.d = -987654321012345678.2
c.f = -987654321012345678.2
d.i = -987654321012345678
x.q = Abs(a.q)
y.q = Int(Abs(b.d))
z.f = Int(Abs(c.f))
d64 = Abs(d.i)
Debug x.q
Debug y.q
Debug z.f
Debug d64
Clairement, pas besoin de quad (en 64 bits bien sur) mais la valeur absolue d'un grand nombre décimal... c'est une autre histoire, non ? et finalement... le code d'Ar-S n'est pas hors sujet :roll:

Edit : bien sur, je suis dysléxique en agencement de commande !!!
y.q = Abs(Int(b.d)) marche parfaitement si je veux un entier

Re: ABS ...

Publié : lun. 12/nov./2012 5:14
par graph100
Golfy a écrit :

Code : Tout sélectionner

a.q = -987654321012345678.2
Moi c'est ça qui m'a surpris :lol:
Tu mets un nombre à virgule dans un format entier, le quad.

et plus haut c'est même pire ! Tu as utilisé l'auto-assignation de pb pour tes variables
-9876543210123456789.9
c'est pas un entier.

Mais il me semble que la doc encadre le sujet. A moins que la fonction ne marche pas exactement comme l'aide le dis.
Aide de PB a écrit :Resultat.f = Abs(Nombre.f)
C'est des flottant simple précision partout.
fait toi une macro ou une procedure adaptée sur les variations de

Code : Tout sélectionner

If nombre < 0 : res = -nombre : EndIf

Re: ABS ...

Publié : lun. 12/nov./2012 11:10
par Golfy
graph100 a écrit :
Golfy a écrit :

Code : Tout sélectionner

a.q = -987654321012345678.2
Moi c'est ça qui m'a surpris :lol:
Tu mets un nombre à virgule dans un format entier, le quad.

fait toi une macro ou une procedure adaptée sur les variations de

Code : Tout sélectionner

If nombre < 0 : res = -nombre : EndIf
C'est pas faux :oops:
Je retombe dans ce vieux travers de GFA basiciens : je m'attendais à ce que Purebasic tronque la valeur décimale automatiquement :oops:
Tu as entièrement ( :mrgreen: ) raison : si je choisis un type, ce n'est pas pour y mettre autre chose :)

Re: ABS ...

Publié : lun. 12/nov./2012 21:19
par graph100
je pense qu'effectivement PB fait la conversion lorsque tu assignes un type à ta variable. (et c'est une troncature dans le cas que tu as utilisé, mais j'ralais pour le principe :mrgreen: )
Mais quand tu ne précises le type, il me semble qu'il utilise un long par défaut