Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Ile razy wystąpiła dana liczba w tekście?

Ostatnio zmodyfikowano 2016-03-11 16:41
Autor Wiadomość
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.
P-145889
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:
C/C++
#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.
P-145893
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?
P-145895
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
P-145896
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.
P-145897
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.
P-145898
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
.
P-145900
1 2 3 « 4 »
Poprzednia strona Strona 4 z 4