michal11 |
» 2016-03-11 01:02:22 Czy mógłbym prosić jakiegoś eksperta żeby napisał co sądzi o powyższych programach i jak je ocenia ?
Btw. Podoba mi się ten temat, wyszliśmy od prostego w gruncie rzeczy problemu przeszliśmy do bardzo ciekawych postów. |
|
Elaine |
» 2016-03-11 10:17:29 Czy mógłbym prosić jakiegoś eksperta żeby napisał co sądzi o powyższych programach i jak je ocenia ? |
Jak miałbym coś parsować, to pewnie użyłbym biblioteki do tworzenia parserów. Na przykład tak: #include <cstddef> #include <array> #include <string> #include <iostream> #include <boost/spirit/include/qi.hpp> namespace qi = boost::spirit::qi;
int main() { std::array < std::size_t, 49 > counts { }; std::string line; auto handle_integer =[ & ]( int & value, auto && ) { if( value >= 1 && value <= 49 ) { ++counts[ value - 1 ]; } }; while( std::getline( std::cin, line ) ) { auto begin = line.begin(); auto end = line.end(); qi::phrase_parse( begin, end, qi::int_[ handle_integer ] % ',', qi::ascii::space ); } for( std::size_t i = 0; i < counts.size(); ++i ) { std::cout << i + 1 << ": " << counts[ i ] << '\n'; } std::cout.flush(); } Widać znaczny wzrost ilości kodu, ale za to jest skalowalny i w miarę zoptymalizowany ;) |
I niepoprawny, bo konwersja między ciągiem znaków a liczbą zmiennoprzecinkową to dość śliski temat, w którym łatwo popełnić błąd i poprawne rozwiązanie musi korzystać z bignumów. Naiwna konwersja "działa", ale często daje wynik różny od prawdziwego o kilka ULPów. |
|
Kaikso |
» 2016-03-11 14:14:14 A gdyby użył typu stałoprzecinkowego, zdolnego do pomieszczenia najmniejszej i największej wartości danego typu zmiennoprzecinkowego i zaokrąglił wynik tak żeby spokojnie zmieścił się w liczbie zmiennoprzecinkowej? |
|
mokrowski |
» 2016-03-11 14:47:12 @michal11, ja tam ekspertem nie jestem i mam mały staż na tym forum więc się nie będę wypowiadał.. Podam tylko może coś co powinien przeczytać każdy kto dotyka float.. Z floatami zawsze był i będzie problem :-/ http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html ja wiem że długie.. ale warto przynajmniej przejrzeć uważnie aby wiedzieć co i jak (np. problem +0, -0, +InF, -InF oraz problem podwójnej reprezentacji tej samej liczby) a najlepiej przeczytać całość. To dokument jeszcze z czasów SUN'a. Tu jest fajny wywiad z jednym z twórców float i normy IEEE https://www.cs.berkeley.edu/~wkahan/ieee754status/754story.html |
|
michal11 |
» 2016-03-11 15:22:15 Ja też nie jestem ekspertem, pojawiło się tu kilka ciekawych programów chciałbym wiedzieć co osoby o dużo większej wiedzy i umiejętnościach o nich myślą i jak je oceniają. Wydaje mi się, że dzięki temu podnieśli byśmy jeszcze poziom tego forum. |
|
Elaine |
» 2016-03-11 15:59:10 A gdyby użył typu stałoprzecinkowego, zdolnego do pomieszczenia najmniejszej i największej wartości danego typu zmiennoprzecinkowego i zaokrąglił wynik tak żeby spokojnie zmieścił się w liczbie zmiennoprzecinkowej? |
To właśnie jest to, co miałem na myśli pisząc o bignumach. Dla double taka liczba musiałaby mieć, jeśli dobrze liczę, 2102 bity. Dla poczwórnej precyzji, a takżde dla śmiesznych intelowskich 80-bitowych liczb zmiennoprzecinkowych, potrzeba prawie trzydziestu trzech tysięcy bitów. |
|
Kaikso |
» 2016-03-11 16:41:10 A gdyby użył typu stałoprzecinkowego, zdolnego do pomieszczenia najmniejszej i największej wartości danego typu zmiennoprzecinkowego i zaokrąglił wynik tak żeby spokojnie zmieścił się w liczbie zmiennoprzecinkowej? |
Chciałem się po prostu upewnić czy pisząc tego typu funkcje (atof() itp.) nie popełniłem błędów, bo właśnie w taki sposób je implementowałem. No to ja dla porównania dam kompleksowy program (po za takimi rzeczami jak np. sprawdzanie czy liczba nie wychodzi po za zakres). |
Tu miałem namyśli że kod jest napisany z pominięciem precyzji, a do osiągnięcia większej dokładności użyłem long double zamiast zwykłego float . |
|
1 2 3 « 4 » |