Převod stringu do doublu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Převod stringu do doublu – C / C++ – Fórum – Programujte.comPřevod stringu do doublu – C / C++ – Fórum – Programujte.com

 

Hula0
Návštěvník
26. 12. 2007   #1
-
0
-

Potřebuju řetezec ve stringu převést do doublu např. vstupní čislo bude 1.32465489e+002.Pokud někdo víte jak na to ozvěte se díky.
Vstup je z textového souboru ne z klavesnice.
ICQ : 211005169

Nahlásit jako SPAM
IP: 82.202.30.–
Jura
~ Anonymní uživatel
637 příspěvků
26. 12. 2007   #2
-
0
-

Zdravím,

použij std::istringstream

Nahlásit jako SPAM
IP: 85.207.192.–
mephi0
Expert
Nahlásit jako SPAM
IP: 85.248.56.–
Program nemusi fungovat rychle, staci ze funguje dostatecne rychle.
_k_
Duch
26. 12. 2007   #4
-
0
-

...alebo jednoducho
double cislo = atof(retazec_cislo)

Nahlásit jako SPAM
IP: 195.91.54.–
AdamHlavatovic0
Stálý člen
26. 12. 2007   #5
-
0
-

To Hula :

std::string str("1.2329873244");

std::istringstream istrs(str);
double number_i_need = 0.0;
istrs >> number_i_need;

popisany kod som si neoveroval, tak dufam ze bude fungovat

Nahlásit jako SPAM
IP: 217.73.16.–
Hula0
Návštěvník
26. 12. 2007   #6
-
0
-

Dekuju vsem prevod uz mi funguje :smile2: Ale mam problem s presnosti vypoctu, zadavam cisla napr. "1.2697189e+002" ale kdyz je ze stringu prevedu do doublu a vypisu na obrazovku je z neho toto "126.972" .Potreboval bych nejak nastavit aby mi to porad pocitalo s cislama ve v puvodnim tvaru "0.0000000e+000" .
Děkuju za rady

Nahlásit jako SPAM
IP: 82.202.30.–
Jura
~ Anonymní uživatel
637 příspěvků
26. 12. 2007   #7
-
0
-

Tak počítat to v tomhle tvaru určitě nebude. Přesnost taky moc neovlivníš. Nicméně pokud to chceš jen vypisovat ve vědeckém formátu, tak stačí nastavit formátovací flag výstupního proudu pomocí metoy setf.



std::cout.setf(std::ios_base::scientific, std::ios_base::floatfield);
double d = 12.456e+002;
std::cout << d << std::endl;
printf("%e\n", d); // jen pro nazornost

Nahlásit jako SPAM
IP: 85.207.192.–
Hula0
Návštěvník
26. 12. 2007   #8
-
0
-

A vedel by teda nekdo jak zvýšit přesnost?

Nahlásit jako SPAM
IP: 82.202.30.–
Jura
~ Anonymní uživatel
637 příspěvků
26. 12. 2007   #9
-
0
-

Pokud se nemýlím, tak přesnost určitě neovlivníš. Ta je dána velikostí datového typu a u doublu přenot také určuje standard IEEE 754. Kromě toho jsi si opravdu jistý, že double ti nestačí(snad by stačil i float)?? A tuším, že 15 platných číslic je dost, když se kouknu na ten příklad, tak se to tam prostě vejít musí. Rozhodně se neneche oklmat výpisem, ten bude vždy zaokrouhlený. Pokud ti to nestačí, pak sáhni po nějaké knihovně.

Nahlásit jako SPAM
IP: 85.207.192.–
Hula0
Návštěvník
27. 12. 2007   #10
-
0
-

A nevis jestli nejde to zaokrouhlovani nejak vypnout?

Nahlásit jako SPAM
IP: 82.202.30.–
Jura
~ Anonymní uživatel
637 příspěvků
27. 12. 2007   #11
-
0
-

No, tak si pomocí metody precision výstupního proudu nastav počet číslic. Ale opatrně double má, jak jsem psal 15 platných číslic, takže pak už tam bude jen nějaký bordel. Viz příklad



std::cout.setf(std::ios_base::scientific, std::ios_base::floatfield);
std::cout.precision(20);
double d = 1.24567891235676129e+002;
std::cout << d << std::endl;

Nahlásit jako SPAM
IP: 85.207.192.–
Hula0
Návštěvník
29. 12. 2007   #12
-
0
-

Dik Jura.
Funguje to jak si to psal, ale stejně se mi výsledky mírně liší od vzorovýho zadaní.Když pár čísel vynásobim, umocnim,odmocnim tak to asi sem tam něco zaokrouhlý a tam je ta chyba.To jedine nějak vypnout zaokrouhlování...

Nahlásit jako SPAM
IP: 82.202.30.–
Jura
~ Anonymní uživatel
637 příspěvků
29. 12. 2007   #13
-
0
-

Jak už jsem psal. Double má omezenou přesnost jen na 15 číslic, to ostaní může být cokoliv - prostě nějaké smetí. takže pokud používáš umocnění, tak je možné že se dostaneš za těch 15 číslic a pak to počítá i s tím bordlem. Jen taková otázka: K čemu potřebuješ, tak přesné výpočty?? Teda pokud to není tajemstvím...

Nahlásit jako SPAM
IP: 85.207.192.–
Hula0
Návštěvník
29. 12. 2007   #14
-
0
-

Dělal sem program do jedný soutěže kde je úkolem najít dva nejbiližší body v prostoru...vypsat jejich souřadnice a vzdálenost.Je to zadaný ve vědeckém tvaru.A výsledek má být stejně.Ale mě právě od vzorovýho liší jen asi o stotísiciny...
Program už jsem odeslal takže už to je jedno.

Nahlásit jako SPAM
IP: 82.202.30.–
tmi0
Věrný člen
31. 12. 2007   #15
-
0
-

a s jakou slozitosti si to napsal? da se to v n*log n pomoci metody rozdel a panuj...

Nahlásit jako SPAM
IP: 89.185.230.–
ksp.mff.cuni.cz -- doporučuje 5 z 0 přetečených bufferů!
Hula0
Návštěvník
2. 1. 2008   #16
-
0
-

Nu nevim jak to myslis s tou slozitosti, ale ja to psal pomoci funkci sqrt() a pow() .Pod "n*lod n" si vybavim logaritmy z matiky, ale jeste sme neprobirali...takze vůbec netušim jak bych měl použít.
A tvoje ICQ je opravdu 666666666 ??? takovy magicky cislo ..

Nahlásit jako SPAM
IP: 82.202.30.–
tmi0
Věrný člen
2. 1. 2008   #17
-
0
-

To Hula : to je identifikacni cislo ICQ - inferal christ-killing quail - tedy pekelne krestany-vrazdici krepelky, a odpovida trojitemu tzv. číslu šelmy.

slozitosti programu myslim jeho asymptotickou casovou slozitost, coz se da volne interpretovat jako zavislost delky vypoctu na vstupnich datech.
jestlize jsi to psal pocitanim vzdalenosti mezi kazdou dvojici bodu (predpokladam), pak je slozitost n*n> pro kazdy bod musis zkontrolovat jeho vzdalenost k ostatnim bodum, kterych je (n-1), tedy n*(n-1) operaci (zhruba), coz se asymptoticky zapisuje O(n*n). lepsi reseni najdes trebas na strankach ksp> http://ksp.mff.cuni.cz/tasks/19/solution2.html#task5 (tam resena uloha hledani dvou nejblizsich stromu je totozna s tvoji)

Nahlásit jako SPAM
IP: 89.185.230.–
ksp.mff.cuni.cz -- doporučuje 5 z 0 přetečených bufferů!
Hula0
Návštěvník
2. 1. 2008   #18
-
0
-

Tak jestli sem to dobře pochopil, tak složitost mojeho programu je n*(n-1). Prostě spočitám vzdálenost uložim, přejdu na dalším spočítám, porovnám s předchozí ...

Nahlásit jako SPAM
IP: 82.202.30.–
tmi0
Věrný člen
2. 1. 2008   #19
-
0
-

presne tak, ovsem pri urcovani asymptoticke slozitosti se vpodstate ignoruji konstanty a cleny mocniny nizsiho radu nez nejvyssi clen, protoze od urcite velikosti vstupu na vysledek maji malinky vliv (predstav si ze by si tu vzdalenost pocital treba pro 100000 bodu, pak by bylo celkem jedno jestli to je n*n nebo n*(n-1)).

Nahlásit jako SPAM
IP: 89.185.230.–
ksp.mff.cuni.cz -- doporučuje 5 z 0 přetečených bufferů!
Hula0
Návštěvník
2. 1. 2008   #20
-
0
-

Tohle pocita přibližně s 1000 ale může klidně víc.

Nahlásit jako SPAM
IP: 82.202.30.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 70 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý