ABS ...

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
jerexgrz
Messages : 279
Inscription : dim. 05/juin/2005 20:27

ABS ...

Message par jerexgrz »

Une petite commande pour avoir des valeurs absolues pour les entiers !!
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: ABS ...

Message 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)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: ABS ...

Message par Golfy »

Pourquoi ne pas utiliser int() ?

Code : Tout sélectionner

Debug Abs(-5)        --> 5.0 
Debug Int(Abs(-5))   --> 5
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: ABS ...

Message 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
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Mindphazer
Messages : 639
Inscription : mer. 24/août/2005 10:42

Re: ABS ...

Message 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 ?
Bureau : Win10 64bits
Maison : Macbook Pro M1 14" SSD 512 Go / Ram 16 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: ABS ...

Message 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.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: ABS ...

Message par Ar-S »

Certes 8)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: ABS ...

Message 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 ?
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: ABS ...

Message 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.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: ABS ...

Message 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
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)]
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: ABS ...

Message 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
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: ABS ...

Message 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
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: ABS ...

Message 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 :)
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: ABS ...

Message 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
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Répondre