Besoin de votre avis pour la Librairie String Thread-Safe

Sujets variés concernant le développement en PureBasic

Est-il préférable pour VOUS de:

Ne pas faire ces 3 fonctions
3
27%
Faire la fonction StrU mais pas les deux autres
0
Aucun vote
Faire les fonctions StrF et ValF mais pas StrU
1
9%
Faire les 3 fonctions même si les Float c'est imprécis
5
45%
--- Je ne me prononce pas car je ne suis pas concerné ---
2
18%
 
Nombre total de votes : 11

LeCyb
Messages : 273
Inscription : dim. 26/déc./2004 20:49

Besoin de votre avis pour la Librairie String Thread-Safe

Message par LeCyb »

Après avoir remarqué les problèmes liés aux chaînes, à savoir la taille (max 65k) et l'impossiblité de les utiliser dans des threads, je me suis mis à la quête d'une solution correcte.
Après de nombreuses recherches et questions j'ai pu me baser sur un code du forum allemand pour recréer les fonctions de la librairie String mais sans les deux problèmes que j'ai cité.

Tout fonctionne à merveille sauf 3 fonctions:
- StrF
- ValF
- StrU

En effet StrF et ValF utilisent le type Float et il existe un problème inhérant à l'architecture binaire qui provoque une imprécision des valeurs.
Pour faire plus simple si vous transformez la chaîne "123.123" en Float on obtient le résultat 123.123001 et inversément si on transforme le Float 123.123 on obtient la chaîne "123.123001".
Selon mes informations, peu importe le compilateur ou la machine c'est dû à l'architecture 32bit; la 64bit ne fait qu'augmenter la précision mais ne règle pas définitivement le problème.

Pour la fonction StrU c'est plus simple, je ne l'ai pas implémentée car elle me semble très peu (voir pas du tout) utilisée.

Afin de contenter le plus grand nombre de personnes, je vous demande si ces fonctions sont nécéssaires tout en sachant que StrF et ValF seront d'office "imprécises".

Je précise aussi que le code source, la librairie et l'aide (si j'ai le courage) seront mis à votre disposition après avoir testé et retesté la chose (d'ailleurs si ça intéresse quelques testeurs :wink:).

Merci à tous.
Vive le thread-safe !
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

à mon avis, il ne faut pas se bloquer sur la précision des floats mais voir si les fonctions sont nécessaires à tes besoins ou pas.
ensuite, c'est à l'utilisateur de faire avec le prob de présicion ...
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)]
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

N'utilisant pas ces fonctions, j'ai voté aucune bien que StrU() pourrait ^peut-être m'être nécessaire. Sinon je veux bien tester tout ça ;) . Tu as réussi ton problème d'hier soir ?
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Oui, il a eu un coup de pouce :D
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)]
LeCyb
Messages : 273
Inscription : dim. 26/déc./2004 20:49

Message par LeCyb »

Tu ne diras pas de qui hein ;)
Vive le thread-safe !
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Le Soldat Inconnu a écrit :à mon avis, il ne faut pas se bloquer sur la précision des floats mais voir si les fonctions sont nécessaires à tes besoins ou pas.
ensuite, c'est à l'utilisateur de faire avec le prob de présicion ...
Tout à fait d'accord :D
LeCyb
Messages : 273
Inscription : dim. 26/déc./2004 20:49

Message par LeCyb »

Après de multiples essais je n'ai pas réussi à reproduire les deux fonctions StrF et ValF.
J'arrive à m'y rapprocher mais dans certains cas le résultat n'est pas identique aux fonctions existantes.

Je demande donc un coup de pouce à quiconque peut me fournir un code qui permet de récupérer la valeur de chaque chiffre (ou du moins ceux après la virgule) composant un float sur une certaine longueur.

Exemple:
Float = 1.333
Longueur 2 donne 1 3 3
Longueur 6 donne 1 3 3 3 0 0 0
Longueur 7 donne 1 3 3 2 9 9 9 9

Si je ne trouve pas de solution je ne proposerai probablement pas la librairie publiquement (que sur demande quoi) car j'aime le travail bien fait.

PS: J'ai tenté plusieurs approches:
- séparer la valeur entière et puis la partie décimale
- traiter le tout
- traitement avec multiplication par 10 et Int()
- traitement avec modulo et mutiplication par 10
- traitement avec Pow() pour récupérer les décimales dans un entier
Aucune de ces méthodes n'a donné entière satisfaction.
Vive le thread-safe !
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

en fait, il faut toujours partir de la valeur la plus petite pour avoir la meileur précision possible

si on a 1.4587

il faut commencer par 0.0007 pour garder la meilleur précision possible
puis ajouter 0.008 (peu de perte de qualité car on monte en valeur, la perte se fait sur les petits chiffres de l'arrondi 0.000000????)
etc ...

car dans l'autre sens
1
+0.4 (hop arrondi à cause du format float)
+ 0.05 (qui est donc ajouté à qlq chose d'arrondi et donne lieu a une plus grosse erreur. dans ce cas, on cumul les erreurs de précision de façon très visible)
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)]
Répondre