Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere?
Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere?
HONOR Magic V6 è arrivato in Italia a 2.299,90 euro con una promessa precisa: unire 4 mm di spessore da aperto (8,75 mm chiuso nel modello White, 9 mm negli altri colori) a una batteria da 6.660 mAh, la più capiente mai vista su un pieghevole. Lo abbiamo usato per oltre una settimana in versione Red 16/512 GB per capire se lo Snapdragon 8 Elite Gen 5 tiene testa alla concorrenza anche fuori dai benchmark ufficiali
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7 punta su un display ampio e fluido, una batteria capace di accompagnare l'uso quotidiano senza ansie da ricarica e un prezzo accessibile, a partire da 179,90 euro per la versione con 64 GB di storage. Lo Snapdragon 6s 4G Gen 2 e i 4 GB di RAM della configurazione più diffusa frenano però chi cerca reattività e multitasking spinto: ecco il bilancio dopo due settimane di prova diretta
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Polygon è la concept car di Peugeot che mostra il futuro delle soluzioni del segmento B: tra design compatti e innovativi affiancati da dimensioni compatte uno scherzo dalla manovrabilità incredibile per le manovre a bassa velocità
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-10-2005, 17:01   #1
shang84
Senior Member
 
Iscritto dal: Apr 2005
Città: <-|-|-*|*-|-|->
Messaggi: 347
[C++/C] come convertire da stringa a float

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.

Grazie a tutti!
shang84 è offline   Rispondi citando il messaggio o parte di esso
Old 21-10-2005, 17:05   #2
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Come mai non fa al caso tuo?
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 21-10-2005, 18:01   #3
shang84
Senior Member
 
Iscritto dal: Apr 2005
Città: <-|-|-*|*-|-|->
Messaggi: 347
Quote:
Originariamente inviato da ilsensine
Come mai non fa al caso tuo?
Ho espresso male la domanda

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!
shang84 è offline   Rispondi citando il messaggio o parte di esso
Old 21-10-2005, 23:08   #4
max246
Senior Member
 
Iscritto dal: May 2005
Messaggi: 340
em se non erro.. non picchiare se sbaglio

dovresti fare una cosa del genere:

float numero;
numero = (float) str;


cosi dovrebbe andare.. pero non ti assicuro niente
max246 è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2005, 07:09   #5
drako89
Senior Member
 
Iscritto dal: Jul 2005
Città: Pescara
Messaggi: 304
Quote:
Originariamente inviato da max246
em se non erro.. non picchiare se sbaglio

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
drako89 è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2005, 07:42   #6
NA01
Senior Member
 
L'Avatar di NA01
 
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
Quote:
Originariamente inviato da max246
float numero;
numero = (float) str;
no, non puoi fare una cosa del genere.
non riesce nemmeno a compilare.

ciao!
NA01 è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2005, 10:23   #7
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
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...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2005, 10:30   #8
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da shang84
Ho espresso male la domanda

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).
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2005, 10:57   #9
shang84
Senior Member
 
Iscritto dal: Apr 2005
Città: <-|-|-*|*-|-|->
Messaggi: 347
Quote:
Originariamente inviato da cionci
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
shang84 è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2005, 11:01   #10
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Perchè non hai fatto come ti ho detto io...

stringstream str;
double numeroDouble;

str << "332.3232323232";
str >> numeroDouble;
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2005, 11:22   #11
shang84
Senior Member
 
Iscritto dal: Apr 2005
Città: <-|-|-*|*-|-|->
Messaggi: 347
Quote:
Originariamente inviato da cionci
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!

Ultima modifica di shang84 : 22-10-2005 alle 11:41.
shang84 è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2005, 11:25   #12
shang84
Senior Member
 
Iscritto dal: Apr 2005
Città: <-|-|-*|*-|-|->
Messaggi: 347
Quote:
Originariamente inviato da ilsensine
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 è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2005, 11:51   #13
shang84
Senior Member
 
Iscritto dal: Apr 2005
Città: <-|-|-*|*-|-|->
Messaggi: 347
Quote:
Originariamente inviato da cionci
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!
shang84 è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2005, 13:09   #14
Qu@ker
Member
 
Iscritto dal: Apr 2004
Messaggi: 130
Codice:
#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;
}
Qu@ker è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2005, 14:06   #15
shang84
Senior Member
 
Iscritto dal: Apr 2005
Città: <-|-|-*|*-|-|->
Messaggi: 347
Quote:
Originariamente inviato da Qu@ker
Codice:
#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?

Ultima modifica di shang84 : 22-10-2005 alle 14:09.
shang84 è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2005, 14:39   #16
Qu@ker
Member
 
Iscritto dal: Apr 2004
Messaggi: 130
Come sarebbe dove le hai trovate? Io queste cose le so.
Qu@ker è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2005, 14:43   #17
shang84
Senior Member
 
Iscritto dal: Apr 2005
Città: <-|-|-*|*-|-|->
Messaggi: 347
Quote:
Originariamente inviato da Qu@ker
Come sarebbe dove le hai trovate? Io queste cose le so.
Eh eh, certo che le sai , ti domandavo pero' se hai qualche link o simili per potermi documentare io.
shang84 è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2005, 15:23   #18
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da shang84
Non capisco bene come usare questa funzione
long double val = strtold("1.2345", NULL);

Quote:
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"
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2005, 15:40   #19
shang84
Senior Member
 
Iscritto dal: Apr 2005
Città: <-|-|-*|*-|-|->
Messaggi: 347
Quote:
Originariamente inviato da ilsensine
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"
eh eh! Thank you!
shang84 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere? Recensione HONOR Magic V6: spessore record e sup...
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni Redmi Pad 2 9.7: ampio display, economico e peso...
Peugeot Polygon Concept: ecco il futuro delle utilitarie Peugeot Polygon Concept: ecco il futuro delle ut...
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
HP blocca anche le cartucce di inchiostr...
Acquisizione Apple: SigScalr chiude, gli...
Cooler Master HAF II 500 integra le vent...
I musulmani non dovrebbero usare le crip...
AMD Radeon 9000 pronte a sorpassare le N...
Soulframe, il nuovo gameplay chiarisce m...
La Commissione UE presenterà una ...
Niente più eliche: con due ali, i...
Waze si aggiorna con nuove funzioni IA: ...
Oltre 200 economisti ed esperti di IA la...
I migliori produttori del 2026? Facci sa...
Claude Code consuma fino a 33 mila token...
Si chiama Starfire il chip con cui Intel...
Chrome espone l'OS reale dietro ogni ric...
Intel investe altri 5 miliardi di euro p...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 22:04.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v