Page 1 sur 1

ValD(Chaine$)

Publié : lun. 26/juil./2021 9:56
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

Re: ValD(Chaine$)

Publié : mer. 28/juil./2021 15:38
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$)

Re: ValD(Chaine$)

Publié : mer. 28/juil./2021 23:16
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

Re: ValD(Chaine$)

Publié : dim. 10/oct./2021 22:03
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...

Re: ValD(Chaine$)

Publié : jeu. 14/oct./2021 9:50
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$

Re: ValD(Chaine$)

Publié : ven. 15/oct./2021 9:04
par blendman
ah, tu as trouvé avec formatNumber(), puisque tu peux définir le nombre de décimal ! ;)

Re: ValD(Chaine$)

Publié : ven. 15/oct./2021 19:39
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

Re: ValD(Chaine$)

Publié : sam. 16/oct./2021 9:29
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

Re: ValD(Chaine$)

Publié : sam. 16/oct./2021 22:01
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.

Re: ValD(Chaine$)

Publié : dim. 17/oct./2021 8:19
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