problème conversion _DOUBLE_ vers string

Librairie C++ de calcul formel/ C++ symbolic computation library

Modérateur : xcasadmin

Répondre
loic
Messages : 168
Inscription : ven. mars 14, 2008 7:20 pm

problème conversion _DOUBLE_ vers string

Message par loic » dim. avr. 29, 2012 2:29 pm

Bonjour,
Je viens de me pencher sur un problème d'affichage des _DOUBLE_.
Systématiquement, j'ai un ".0" redondant à l'affichage.

Par exemple, lorsque je tape:

Code : Tout sélectionner

evalf(pi)
3.14159265359.0
Concrètement, dans mon programme:

Code : Tout sélectionner

answer=protecteval(gen("evalf(pi)",context),25,context);
cout <<answer.print(context)<<cendl;
je retrouve ce 3.14159265359.0

Une petite idée? (peut-être une mauvaise initialisation de certains paramètres giac, style langue etc...)

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: problème conversion _DOUBLE_ vers string

Message par parisse » dim. avr. 29, 2012 2:58 pm

je me demande si ça ne vient pas de la virgule comme séparateur décimal, parce que je teste de mon coté que la réponse de la libc pour l'affichage d'un double contient un séparateur décimal afin d'ajouter un . lorsqu'on a un double qui est égal à un entier (toujours le . pour moi comme dans tous les softs scientifiques), du coup une virgule n'est pas considérée comme un .
Donc c'est dans le format d'affichage pour la libc qu'il faut changer quelque chose (mais quoi??).

loic
Messages : 168
Inscription : ven. mars 14, 2008 7:20 pm

Re: problème conversion _DOUBLE_ vers string

Message par loic » mer. mai 09, 2012 5:10 pm


parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: problème conversion _DOUBLE_ vers string

Message par parisse » mer. mai 09, 2012 6:48 pm

en fait, je le fais dans gen.cc mais pour la lecture seulement car c'est assez lourd:

Code : Tout sélectionner

#ifdef HAVE_LIBPTHREAD
      int locked=pthread_mutex_trylock(&locale_mutex);
      if (!locked){
	char * lc=setlocale(LC_NUMERIC,0);
	setlocale(LC_NUMERIC,"POSIX");
	d=strtod(s,&endchar);
	setlocale(LC_NUMERIC,lc);
	pthread_mutex_unlock(&locale_mutex);
      }
      else
	d=strtod(s,&endchar);	
#else
      char * lc=setlocale(LC_NUMERIC,0);
      setlocale(LC_NUMERIC,"POSIX");
      d=strtod(s,&endchar);
      setlocale(LC_NUMERIC,lc);
#endif
On pourrait le faire aussi en écriture, il faut juste tester pour voir si ça n'a pas d'effet de bord.

loic
Messages : 168
Inscription : ven. mars 14, 2008 7:20 pm

Re: problème conversion _DOUBLE_ vers string

Message par loic » jeu. mai 10, 2012 1:50 pm

Une petite remarque qui peut aider, j'espère:

Avec: language(1,context):

Code : Tout sélectionner

3/5.0
0.6
Avec: language(0,context):

Code : Tout sélectionner

3/5.0
0.6,0
Qu'en pensez-vous?

loic
Messages : 168
Inscription : ven. mars 14, 2008 7:20 pm

Re: problème conversion _DOUBLE_ vers string

Message par loic » jeu. mai 10, 2012 2:15 pm

Bon alors là, je comprends plus. Ne pas faire attention aux messages précédents.
Je n'arrive plus à reproduire le cas ou cela fonctionne avec 0.6 pour réponse....

ça doit être encore plus compliqué....

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: problème conversion _DOUBLE_ vers string

Message par parisse » ven. mai 11, 2012 10:50 am

Bon, plutot qu'un gros changement, je vais faire l'ajustement suivant dans gen.cc, ligne 9315:

Code : Tout sélectionner

 if (s[i]=='.' || s[i]==',' || s[i]=='e' || s[i]=='E')

loic
Messages : 168
Inscription : ven. mars 14, 2008 7:20 pm

Re: problème conversion _DOUBLE_ vers string

Message par loic » mer. mai 16, 2012 2:07 pm

Avec ce changement, le séparateur décimal devient chez moi la virgule ce qui pose problème dans les listes ou vecteurs.

Ex:

Code : Tout sélectionner

(0.6,2)
Réponse: (0,6,2)
on croit alors qu'il y 3 éléments au lieu de deux...

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: problème conversion _DOUBLE_ vers string

Message par parisse » mer. mai 16, 2012 2:19 pm

Je pense que le mieux ce serait de mettre votre programme en mode locale C, en mettant au début de main
setlocale(LC_NUMERIC,"POSIX");
(inclure au début du fichier #include <locale.h>).

loic
Messages : 168
Inscription : ven. mars 14, 2008 7:20 pm

Re: problème conversion _DOUBLE_ vers string

Message par loic » mer. mai 16, 2012 7:44 pm

Je ne sais pas ce que fait cette instruction mais après un test rapide, il semble que cela fonctionne.
10^3 mercis ;)

Répondre