Question sur StrD

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
lepiaf31
Messages : 510
Inscription : dim. 25/mars/2007 13:44
Localisation : Toulouse, France
Contact :

Question sur StrD

Message par lepiaf31 »

Bonjour,
voilà j'ai un petit problème avec la fonction StrD(Valeur.d [, NombreDeDecimales]). La doc dit:
Un nombre maximum de décimales peut être spécifié. Le nombre sera arrondi si 'NombreDeDecimales 'est plus petit que le nombre de décimales existantes de 'Valeur.d '.
Donc si je ne précise pas NombreDeDecimales, la fonction devrait me renvoyer le nombre maximum de décimales, non ?

Regardez ce code:

Code : Tout sélectionner

var.d = 0.123123123123123
Debug StrD(var) ;renvoi 0.1231231231
Debug StrD(var, 15) ;renvoi bien 0.123123123123123
Je ne comprends pas pourquoi quand je ne précise pas NombreDeDecimales, la fonction ne me renvoi pas toutes les décimales ...

Si quelqu'un pouvait éclairer ma lanterne.

Merci d'avance !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Question sur StrD

Message par Backup »

peut etre que tout simplement Fred a voulu mettre une valeur par defaut a 10 decimales .. :)
lepiaf31
Messages : 510
Inscription : dim. 25/mars/2007 13:44
Localisation : Toulouse, France
Contact :

Re: Question sur StrD

Message par lepiaf31 »

Arf mais ça m'arrange pas moi, parce que je ne connais pas à l'avance le nombre de décimales que contiendra la variable. Y a-t-il un moyen pour connaitre le nombre de décimales d'un Double ?
Avatar de l’utilisateur
SPH
Messages : 4949
Inscription : mer. 09/nov./2005 9:53

Re: Question sur StrD

Message par SPH »

lepiaf31 a écrit :Arf mais ça m'arrange pas moi, parce que je ne connais pas à l'avance le nombre de décimales que contiendra la variable. Y a-t-il un moyen pour connaitre le nombre de décimales d'un Double ?
Assez souvent, il n'y a pas un nombre fini de décimal...
Réfléchis : 7/3=2.333333....... Donc, là, fred etait sensé faire quoi ? Ouvrir 100000 longs pour stocker les "3" ?

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Question sur StrD

Message par Le Soldat Inconnu »

oui, c'est une erreur de l'aide (j'avais fais un rapport de bug a ce sujet)

par défaut, c'est à 10 décimale après la virgule.

Pour arrondir un chiffre à X nombre significatif, voici un code :

Code : Tout sélectionner

Procedure.s Arrondi(Valeur.d, Precision = 12)
	; Arrondi de la valeur
	Precision - 1
	Limite.d = 1
	While Abs(Valeur) >= Limite * 10 And Precision > 1
		Limite * 10
		Precision - 1
	Wend
	While Abs(Valeur) < Limite
		Limite / 10
		Precision + 1
	Wend
	ProcedureReturn RTrim(RTrim(StrD(Valeur, Precision), "0"), ".")
	
EndProcedure
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)]
lepiaf31
Messages : 510
Inscription : dim. 25/mars/2007 13:44
Localisation : Toulouse, France
Contact :

Re: Question sur StrD

Message par lepiaf31 »

D'accord merci LSI =)
Donc si je comprends bien dans tous les cas on est obligé donner la précision que l'on souhaite avoir ?

EDIT: Bon alors ya un truc que je pige pas va falloir m'expliquer :

Code : Tout sélectionner

Procedure.s Arrondi(Valeur.d, Precision = 12)
   ; Arrondi de la valeur
   Precision - 1
   Limite.d = 1
   While Abs(Valeur) >= Limite * 10 And Precision > 1
      Limite * 10
      Precision - 1
   Wend
   While Abs(Valeur) < Limite
      Limite / 10
      Precision + 1
   Wend
   ProcedureReturn RTrim(RTrim(StrD(Valeur, Precision), "0"), ".")
   
EndProcedure

var.d = 2.12345678
Debug StrD(var, 20)
Debug var
Debug Arrondi(var, 20)
et voilà ce que j'obtiens:
2.12345678000000020000
2.1234567800000002
2.1234567800000002
Comment ça se fait qu'il y a 000000002 qui apparait ? J'imagine que ça a un rapport avec la manière dont sont stocké les nombre flottants en mémoire mais j'aimerais quand meme qu'on m'explique ^^
Avatar de l’utilisateur
SPH
Messages : 4949
Inscription : mer. 09/nov./2005 9:53

Re: Question sur StrD

Message par SPH »

Oui, récement, j'ai aussi noté ce bug :!:

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Question sur StrD

Message par Le Soldat Inconnu »

la précision maxi est de 17 nombre significatif soit 1.2345678901234567

ton 2 à la fin est sur le dernier nombre significatif possible. Et un nombre flottant ne tombe jamais juste. les 2-3 derniers chiffres significatifs peuvent s'écarter du résultat exact après plusieurs opérations.
La faute au binaire.
0.5 = %0.1 tombe juste
0.75 =%0.11 aussi car ce sont des valeurs binaires
0.3 par contre non

Le mieux est d'arrondir à 14 chiffre significatif grand maximum
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)]
lepiaf31
Messages : 510
Inscription : dim. 25/mars/2007 13:44
Localisation : Toulouse, France
Contact :

Re: Question sur StrD

Message par lepiaf31 »

D'accord merci pour ces précisions =)
Répondre