ison |
» 2010-11-22 16:09:19 no i prosz... pałkerskie rozwiązanie: #include <iostream> #include <string>
template < class f_T > void FloatRead( f_T & f1 ) { f1 = 0.0; std::string temp; std::cin >> temp; f_T multiplier = 1; int ix = temp.find( "," ); if( ix ==- 1 ) ix = temp.find( "." ); if( ix ==- 1 ) ix = temp.size(); while(( ix-- ) - 1 ) multiplier *= 10.0; if( temp[ 0 ] == '-' ) multiplier /= 10; for( unsigned int i = 0; i < temp.size(); ++i ) { if( temp[ i ] == ',' || temp[ i ] == '.' || temp[ i ] == '-' ) continue; f1 +=( f_T )( temp[ i ] - 48 ) * multiplier; multiplier /= 10.0; } if( temp[ 0 ] == '-' ) f1 *=- 1; }
int main() { double MyDouble; FloatRead( MyDouble ); std::cout << "MyDouble: " << MyDouble << std::endl; }
tym sposobem możesz wczytywać double (lub floaty, long double) z przecinkiem lub z kropką (działają nawet liczby ujemne :)) miłego wczytywania doubli z przecinkiem zamiast kropki :-) |
|
DejaVu |
» 2010-11-22 18:41:54 To nie jest poprawny sposób na obsługę liczb rzeczywistych. Działać być może działa, ale nie tędy droga, bowiem nie masz wsparcia dla precyzji. |
|
ison |
» 2010-11-22 18:43:40 mógłby pan rozwinąć ten temat? jak nie ma wsparcia dla precyzji? |
|
DejaVu |
» 2010-11-22 18:48:13 wprowadź z 15 zer po przecinku, a następnie 9. |
|
ison |
» 2010-11-22 19:12:02 15 miejsc: dla 0,000000000000001
output MyDouble: 1e-015
9 miejsc: dla 0,000000001
output MyDouble: 1e-009
jak na moje oko to jest dobrze... można zawsze zmienić cout'a na printf'a printf( "MyDouble: %.15lf\n", MyDouble );
15 miejsc: dla 0,000000000000001
output MyDouble: 0.000000000000001
|
|
Elaine |
» 2010-11-22 19:15:32 No ładnie, takiego kodu to tu dawno nie było...
Po pierwsze: jaką masz pewność, że std::string::size_type to właśnie int? Odpowiedź: dokładnie żadną. std::string::size_type to std::allocator<char>::size_type, czyli std::size_t. Ten typ jest typem bez znaku, zazwyczaj szerokości wskaźnika. Na maszynach, gdzie wskaźnik (więc zwykle i size_t) jest szerszy of inta (choćby na AMD64, gdzie najczęściej int to 32 bity, a wskaźnik - i size_t - 64 bity) przy odpowiednio długim stringu może to doprowadzić do nieciekawych wyników (a są tacy, którzy specjalnie stringi dłuższe, niż standardowo wrzucają - choćby po to, by wykorzystać jakieś luki... ;>).
Dalej zresztą masz to podobnie, tylko teraz przynajmniej znakowość (ale szerokość niekoniecznie) się zgadza, bo tym razem masz unsigned int.
Po drugie: jasne, std::string::npos to faktycznie -1 (z tym, że odpowiedniego typu - czyli std::string::size_type, patrz punkt pierwszy). Tylko to pierwsze lepiej oddaje intencje programisty.
Po trzecie: Co oznacza 48? Chodziło ci o '0'? Literały znakowe nie gryzą, naprawdę.
Po czwarte: Ten kod nie daje dokładnych wyników w niektórych sytuacjach (podaj mu np. 10.0000000000000009).
Po piąte: Co z notacją wykładniczą?
Po szóste: byłoby fajnie, gdyby ten kod można było wykorzystać także dla innych strumieni niż std::cin.
Po siódme: jakaś obsługa błędów? Jakakolwiek? |
|
ison |
» 2010-11-22 19:22:29 No ładnie, takiego kodu to tu dawno nie było...
|
bo nikt nie wrzuca tu swoich kodów :D co do size_t to przecież zachodzi konwersja więc to nie ma zbyt dużego znaczenia, jakby miało to kompilator by sypał warningami przy odpowiednio długim stringu
|
...double, float... że jakbyś niby chciał podpisać pod double'a stringa o dużej długości Po piąte: Co z notacją wykładniczą?
|
tzn? gdzie byś chciał tę notację? mam podawać wynik w notacji? double przyjmie taką wartość jaką mu podam, a czy potem będzie wyświetlany w notacji wykładniczej czy zwyczajnie to już nie ode mnie zależy, czyż nie? Po szóste: byłoby fajnie, gdyby ten kod można było wykorzystać także dla innych strumieni niż std::cin.
|
bez przesady, jak ktoś chce to sobie zmieni :p Po siódme: jakaś obsługa błędów? Jakakolwiek?
|
nie :) zakładam że użytkownik nie jest pacanem :p Po trzecie: Co oznacza 48? Chodziło ci o '0'? Literały znakowe nie gryzą, naprawdę.
|
czyżby kwestia gustu? nie ma raczej tablic ascii w których '0' ma inne pole niż 48 |
|
DejaVu |
» 2010-11-22 19:39:19 Widzisz... użyłeś słowa 'raczej' ;p Co oznacza, że sam nie jesteś pewnien czy istnieje jakiś crapowy system (a zarazem kompilator), który inaczej zinterpretuje literał '0' :) |
|
1 « 2 » 3 |