ValD(Chaine$)

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

ValD(Chaine$)

Message par kernadec »

bjr à tous
Fred serait il possible d'ajouter un paramètre optionnel à la commande ValD(chaine$)
pour choisir le nombre de décimales d'une chaine convertie en chiffres
ou ajouter une commande comme dans le " GFA Defnum 5 " pour un format de x chiffres avec le point ou après le point

Code : Tout sélectionner

Macro Inc(a, b)
  a + b
EndMacro

c.d = inc(3.52, 5.7)

Debug StrD(c, 4)

Debug Left(StrD(c, 4), 4)   ; ici différence avec StrD() seul?

Debug ValD(StrD(c, 4)) 
Debug ValD(Left(StrD(c. 4), 4)) 
;Dans ce cas:  ValD() ne tient pas compte de la réduction de décimales des commandes string StrD(chaine$)
Cordialement
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: ValD(Chaine$)

Message par blendman »

coucou

je suppose que ça ça ne convient pas ?

Code : Tout sélectionner

Macro Inc(a, b)
  a + b
EndMacro

c.d = inc(3.52, 5.7)

Debug StrD(c, 4)

Debug Left(StrD(c, 4), 4)   ; ici différence avec StrD() seul?
Debug ValD(StrD(c, 4)) 

Debug ValD(Left(StrD(c, 4), 4)) 
chaine${4} = StrD(ValD(StrD(c, 4)) , 4)

Debug chaine$

;Dans ce cas:  ValD() ne tient pas compte de la réduction de décimales des commandes string StrD(chaine$)
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: ValD(Chaine$)

Message par kernadec »

bjr blendman
oui deux décimales dans ce cas c'est le résultat que j'aimerais avoir avec une variable décimale
car quand on réduit le nombre affiché avec strD() à deux décimales, mais dans la variable numérique valD ne permet
pas de garder le nombre de décimales définie avec StrD(). et cela permettrait de ne plus avoir des nombres
avec une variable décimale qui devrait être 9.22 pour mon exemple au lieu de 9.21999999999999

Cordialement
Avatar de l’utilisateur
Naheulf
Messages : 191
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Re: ValD(Chaine$)

Message par Naheulf »

Le problème viens de l'impossibilité de représenter ce nombre à virgule en base 2. Sauf erreur de calcul de ma part, une version binaire de 9,22 serait 1001,0001110000101000111101 dans laquelle la partie soulignée se répète à l'infini. Difficile de loger tout ça dans les 52 bits correspondant à la mantisse d'un double selon la représentation IEEE 754...
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: ValD(Chaine$)

Message par kernadec »

bjr Naheulf
Merci pour le lien intéressant
donc pas moyen de gérer le nombre de décimale de la mantisse
sinon peut être limiter son nombre de bit :?:
il existe également le commande FormatNumber() qui est semblable a StrD() elle retourne aussi en string
et n'a pas non plus d'options de formatage des décimales.
Cordialement

Code : Tout sélectionner

a$ = FormatNumber(Sqr(2),4)
Debug a$
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: ValD(Chaine$)

Message par blendman »

ah, tu as trouvé avec formatNumber(), puisque tu peux définir le nombre de décimal ! ;)
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: ValD(Chaine$)

Message par kernadec »

salut blendman
Non car le résultat est un string avec FormatNumber()

d'ailleurs FormatNumber() devait plutôt s'appeler FormatString() :mrgreen:

alors que j'aimerais qu'il soit directement formaté en un
chiffre avec le nombre de décimales de mon choix

Cordialement
Avatar de l’utilisateur
TazNormand
Messages : 1294
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: ValD(Chaine$)

Message par TazNormand »

Salut

ce que tu voudrais,, c'est un paramètre supplémentaire dans la commande Round() genre Round(number, mode, [decimals]) ?

Code : Tout sélectionner

var=Round(9.2199999999,#PB_Round_Up, 2)
debug var
; affiche 9.22
var=Round(9.21122334499,#PB_Round_Up, 6)
debug var
; affiche 9.211224
Image
Image
Avatar de l’utilisateur
Naheulf
Messages : 191
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Re: ValD(Chaine$)

Message par Naheulf »

Si tu veut réellement travailler avec des nombres précis au centième tu peut aussi coder ton programme en virgule fixe. L'avantage est que tu récupères les bits servant à l'exposant. Dans ton cas tu multiplie tous tes nombres par 100 et 9,22 se retrouve représenté par l'entier 922.
Attention toutefois :
- adapte bien ton programme à ce changement d'échelle, notamment lors des multiplications/divisions
- attention aux divisions qui ferons des arrondis au plus proche. Ça peu faire perdre plus de précision que l'arrondi des floats/doubles.
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: ValD(Chaine$)

Message par kernadec »

bjr à tous
je souhaiterais une commande conversion ValD(string,n) avec option de la longueur de mantisse définie

@TasNormand merci pour cette idée intéressante, je n'avais pas pensé qu'il pourrait y
avoir la possibilité d'ajouter un paramètre a Round(n.d,4). :)

@Naheulf merci, pour cette idée d'échelle, mais le problème vient comme tu me l'as bien
indiqué de la mantisse qui est confirmé par ton lien sur le sujet.
donc à partir du moment avec ou PureBasic on utilise une variable double ou float
celle-ci auras toujours sa mantisse qui lui colleras au baskets... :?

je pense que sans commande de gestion de la longueur de la mantisse en interne..
c'est un truc de ouf à gérer... 8O

Cordialement
Répondre