Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Abbiamo provato a fondo il nuovo Magic 8 Lite di HONOR, e per farlo siamo volati fino a Marrakech , dove abbiamo testato la resistenza di questo smartphone in ogni condizione possibile ed immaginabile. Il risultato? Uno smartphone praticamente indistruttibile e con un'autonomia davvero ottima. Ma c'è molto altro da sapere su Magic 8 Lite, ve lo raccontiamo in questa recensione completa.
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora
WF-1000X M6 è la sesta generazione di auricolare in-ear sviluppata da Sony, un prodotto che punta a coniugare facilità di utilizzo con una elevata qualità di riproduzione dei contenuti audio e una cura nella riduzione del rumore ambientale che sia da riferimento
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI
Snowflake ha presentato diverse novità per la sua piattaforma legate all'intelligenza artificiale. Quella forse più eclatante è una collaborazione con OpenAI, ma non mancano diverse nuove funzionalità che rendono la piattaforma più flessibile e in grado di rispondere meglio alle esigenze in continuo cambiamento delle aziende
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-10-2005, 18: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, 18: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, 19: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 22-10-2005, 00: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, 08: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, 08: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, 11: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, 11: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, 11: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, 12: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, 12: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 12:41.
shang84 è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2005, 12: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, 12: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, 14: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, 15: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 15:09.
shang84 è offline   Rispondi citando il messaggio o parte di esso
Old 22-10-2005, 15: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, 15: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, 16: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, 16: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 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo MSI Sistema Mesh Roamii BE Pro: il Wi-Fi 7 secondo M...
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
Hyundai: spunta un'elettrica estremament...
Una connessione diretta con AWS European...
La Toyota Yaris avrà una versione...
Minori sessualizzati da Grok: l'UE mette...
NIO stabilisce il nuovo record di scambi...
Dell Private Cloud sempre più ape...
Ennesimo incidente per la guida autonoma...
Dopo le maniglie, è il turno dei ...
Addio incendi incontrollati? Svolt dice ...
WINDTRE si mette in proprio: vender&agra...
The Mandalorian & Grogu: il trailer ...
OpenClaw sotto attacco: i malware infost...
Resident Evil Requiem: pre-load dal 25 f...
Vaticano, la Messa si traduce in 60 ling...
Kia prepara il facelift della Kia EV5: n...
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: 20:04.


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