PDA

View Full Version : [C++/C] come convertire da stringa a float


shang84
21-10-2005, 18:01
Ciao a tutti,
sto cercando un modo per convertire da una stringa del tipo:

char str[50];

contenente il valore = "43.94394"

in float.

Cercando in cplusplus.com ho trovato solo la fonzione atof che converte una stringa in double, ma purtroppo non fa a caso mio. :muro:

Grazie a tutti!

ilsensine
21-10-2005, 18:05
Come mai non fa al caso tuo?

shang84
21-10-2005, 19:01
Come mai non fa al caso tuo?

Ho espresso male la domanda :D

Perche' converte in un float avente solo 7 cifre.

26.55656565656556 -> 26.5565

Io cercavo una funzione che convertisse fino a 20 o + cifre..

pertanto avrei bisogno di lavorare con double o long double..

c'e' qualcosa che potrei usare? ho visto che esiste atod ma non so in che libreria e'..

grazie!

max246
22-10-2005, 00:08
em se non erro.. non picchiare se sbaglio :D

dovresti fare una cosa del genere:

float numero;
numero = (float) str;


cosi dovrebbe andare.. pero non ti assicuro niente ;)

drako89
22-10-2005, 08:09
em se non erro.. non picchiare se sbaglio :D

dovresti fare una cosa del genere:

float numero;
numero = (float) str;


cosi dovrebbe andare.. pero non ti assicuro niente ;)

in effetti una conversione cast penso che vada bene, poi ovviamente sono solo al mio primo anno di programmazione quindi potrei sbagliarmi :P

NA01
22-10-2005, 08:42
float numero;
numero = (float) str;


no, non puoi fare una cosa del genere.
non riesce nemmeno a compilare.

ciao!

cionci
22-10-2005, 11:23
Io per queste cose uso le stringstream:

stringstream str;
double numeroDouble;

str << stringaNumero;
str >> numeroDouble;

Attenzione che non tutti i numeri sono rappresentabili in double...può benissimo essere che il numero convertito non sia identico a quello originale, ma magari scartare di qualche millesimo di punto percentuale... Ma questo è normale...visto che l'insieme dei numeri rappresentabili con i double non è continuo...

ilsensine
22-10-2005, 11:30
Ho espresso male la domanda :D

Perche' converte in un float avente solo 7 cifre.

26.55656565656556 -> 26.5565

Io cercavo una funzione che convertisse fino a 20 o + cifre..

pertanto avrei bisogno di lavorare con double o long double..
atof converte in double, quindi non è lei il problema.

nb se ti serve long double, usa strtold (è standard C99, ma essendo una funzione e non un costrutto dovrebbe essere utilizzabile anche nei programmi c++ se le tue librerie c la contengono).

shang84
22-10-2005, 11:57
Io per queste cose uso le stringstream:

stringstream str;
double numeroDouble;

str << stringaNumero;
str >> numeroDouble;

Attenzione che non tutti i numeri sono rappresentabili in double...può benissimo essere che il numero convertito non sia identico a quello originale, ma magari scartare di qualche millesimo di punto percentuale... Ma questo è normale...visto che l'insieme dei numeri rappresentabili con i double non è continuo...

Ho provato cosi:
"332.3232323232" >> numerodouble;

e successivamente:

stringa >> numerodouble;

Mi in entrambi i casi da un errore di compilazione -> error: invalid operands of types `const

cionci
22-10-2005, 12:01
Perchè non hai fatto come ti ho detto io...

stringstream str;
double numeroDouble;

str << "332.3232323232";
str >> numeroDouble;

shang84
22-10-2005, 12:22
Perchè non hai fatto come ti ho detto io...

stringstream str;
double numeroDouble;

str << "332.3232323232";
str >> numeroDouble;


Hai ragione, ora funziona.
Ma usando il seguente codice:

int j=0;
char tmpstring[50];

do{
c=fgetc(msmFile);
tmpstring[j]=c;
j++;
}while(c!='\n' && c!=' ');

stringstream str;
str << tmpstring;

cout << "Stringa: " << tmpstring << endl;
str >> pepMass;

cout << "Value: " << pepMass << endl;

Il valore convertito perde di precisione infatti l'output risulta:

Stringa: 35.231174769868

Value: 35.2312


Cosa sto sbagliando?

Thanks!

shang84
22-10-2005, 12:25
atof converte in double, quindi non è lei il problema.

nb se ti serve long double, usa strtold (è standard C99, ma essendo una funzione e non un costrutto dovrebbe essere utilizzabile anche nei programmi c++ se le tue librerie c la contengono).

Non capisco bene come usare questa funzione.
Se ho una stringa contenente un float, e un double su cui salvare il valore convertito, che parametri devo specificare dato che strtold ne richiede 2 ed entrambi sono puntatori a char?

Dalla man guide:

long double strtold(const char*nptr,char **endptr);

shang84
22-10-2005, 12:51
Perchè non hai fatto come ti ho detto io...

stringstream str;
double numeroDouble;

str << "332.3232323232";
str >> numeroDouble;

Prova con questo codice:

using namespace std;

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
#include <sstream>

int main ()
{
stringstream str;
double numeroDouble;

str << "332.3232323232";
str >> numeroDouble;

cout << numeroDouble << endl;


char c[40];

c[0]='0';
c[1]='.';
c[2]='0';
c[3]='2';
c[4]='3';
c[5]='4';
c[6]='5';
c[7]='6';
c[8]='0';
c[9]='4';
c[10]='3';
c[11]='4';
c[12]='5';
c[13]='6';
c[14]='0';
c[15]='4';
c[16]='3';
c[17]='4';
c[18]='5';
c[19]='6';
c[20]='0';
c[21]='4';

cout << c << endl;
stringstream ss;

ss << c;
ss >> numeroDouble;

cout << numeroDouble << endl;




return 0;
}


L'output che mi risulta è:

332.323
0.02345604345604345604ÿ¿x@èÃ@üo@,ä@Ð
0.023456

Che purtroppo viene troncato alla 7^ cifra, come se fosse un float.

Non ci capisco + nulla! :muro:

Qu@ker
22-10-2005, 14:09
#include <iostream>
#include <sstream>
#include <string>
#include <iomanip>

using namespace std;

int main(void)
{
string str;
cin >> str;
istringstream is(str);
double d;
is >> d;
cout << "String: " << str << "\n";
cout << "Double: " << setprecision(14) << d << endl;
}

shang84
22-10-2005, 15:06
#include <iostream>
#include <sstream>
#include <string>
#include <iomanip>

using namespace std;

int main(void)
{
string str;
cin >> str;
istringstream is(str);
double d;
is >> d;
cout << "String: " << str << "\n";
cout << "Double: " << setprecision(14) << d << endl;
}


Grande!!!! Ora funziona!! Mi hai fatto un gran favore con questo aiuto!!

Dove hai trovato queste info?

Qu@ker
22-10-2005, 15:39
Come sarebbe dove le hai trovate? Io queste cose le so.
:Prrr:

shang84
22-10-2005, 15:43
Come sarebbe dove le hai trovate? Io queste cose le so.
:Prrr:

Eh eh, certo che le sai :D , ti domandavo pero' se hai qualche link o simili per potermi documentare io.

ilsensine
22-10-2005, 16:23
Non capisco bene come usare questa funzione
long double val = strtold("1.2345", NULL);

Se ho una stringa contenente un float, e un double su cui salvare il valore convertito, che parametri devo specificare dato che strtold ne richiede 2 ed entrambi sono puntatori a char?
Se ti serve un "double" come risultato, è inutile usare la strtold -- è sufficiente la atof.
atof converte in _double_, non in float. Non so cosa si è fumato chi ha generato il nome, la "f" finale sta forse per "fumato" non per "float" :D

shang84
22-10-2005, 16:40
long double val = strtold("1.2345", NULL);


Se ti serve un "double" come risultato, è inutile usare la strtold -- è sufficiente la atof.
atof converte in _double_, non in float. Non so cosa si è fumato chi ha generato il nome, la "f" finale sta forse per "fumato" non per "float" :D

eh eh! Thank you!
:)