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,00
01110000101000111101 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
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()
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...
Cordialement