Jaki typ zmiennych do reprezentacji dużych wartości?
Witam serdecznie!!!
Pisze program liczący silnię (banalny strasznie, ale nie to jest istota aplikacji) inkrementalnie i rekurencyjnie. Głównym zadaniem aplikacji jest porównanie czasu realizacji obliczania wartości silni. Aby móc dostać jakiś sensowny wynik czyli powyżej 1ms wykonuje poszczególne funkcje w pętli po 10tys razy by potem podzielić otrzymany wynik (czas) przez liczbę wykonanych przebiegów. Problem polega na tym że po skompilowaniu aplikacja przy obliczeniach inkrementalnych tak śmiga, że liczenie silni z liczby 100 wykonywane 10000 razy zajmuje poniżej 1ms przez co nie mam wyniku dotyczącego czasu wykonywania. Wynik taki otrzymuje dla silni liczonej z 1000, ale nie mam pojęcia jaki typ zmiennej przechowującej wynik musiałbym mieć by móc w nim zmieścić silnię z takiej liczby.
Jeśli istnieje jakieś rozwiązanie mojego problemu to będę wdzięczny za wszelką pomoc!!!
Z góry dzięki!!!
Pisze program liczący silnię (banalny strasznie, ale nie to jest istota aplikacji) inkrementalnie i rekurencyjnie. Głównym zadaniem aplikacji jest porównanie czasu realizacji obliczania wartości silni. Aby móc dostać jakiś sensowny wynik czyli powyżej 1ms wykonuje poszczególne funkcje w pętli po 10tys razy by potem podzielić otrzymany wynik (czas) przez liczbę wykonanych przebiegów. Problem polega na tym że po skompilowaniu aplikacja przy obliczeniach inkrementalnych tak śmiga, że liczenie silni z liczby 100 wykonywane 10000 razy zajmuje poniżej 1ms przez co nie mam wyniku dotyczącego czasu wykonywania. Wynik taki otrzymuje dla silni liczonej z 1000, ale nie mam pojęcia jaki typ zmiennej przechowującej wynik musiałbym mieć by móc w nim zmieścić silnię z takiej liczby.
Jeśli istnieje jakieś rozwiązanie mojego problemu to będę wdzięczny za wszelką pomoc!!!
Z góry dzięki!!!
- SuperEgo
- Posty: 24
- Rejestracja: 2009-09-06, 17:38
Istnieją wrappery z javowych BIgIntegerów. dla przykładu:
http://www.codeproject.com/KB/cs/biginteger.aspx
http://www.codeproject.com/KB/cs/biginteger.aspx
You know who you are, don't betray yourself.
-

pejs - Posty: 2048
- Rejestracja: 2006-03-22, 20:03
- Miejscowość: Gdańsk
Skoro nie bardzo da się dokładnie i szybko policzyć tak dużych liczb to czy istnieje jakiś sposób na policzenie bardzo małych czasów trwania procesu liczenia silni. timeGetTime() daje dokładność do 1ms a tu potrzebne by pewnie były jednostki o rząd lub dwa mniejsze. Istnieje taka opcja?
- SuperEgo
- Posty: 24
- Rejestracja: 2009-09-06, 17:38
Z takim timerem to by była ciężka sprawa, ale możesz zrobić coś takiego:
Zapuść liczenie silni dla obydwu metod 1000 razy - będziesz miał odpowiednio większe wyniki, które można mierzyć w mierzalnych jednostkach timerów - możesz podzielić przez 1000 - będziesz miał wtedy uśrednienie czasu działania pojedynczego obiegu.
Zapuść liczenie silni dla obydwu metod 1000 razy - będziesz miał odpowiednio większe wyniki, które można mierzyć w mierzalnych jednostkach timerów - możesz podzielić przez 1000 - będziesz miał wtedy uśrednienie czasu działania pojedynczego obiegu.
You know who you are, don't betray yourself.
-

pejs - Posty: 2048
- Rejestracja: 2006-03-22, 20:03
- Miejscowość: Gdańsk
Dzieki!!!
rozwiązałem problem stosują:
Tak swoją drogą czy wszystko gra w tym kodzie, gdyż liczenie silni silni ze 100 metodą iteracyjną trwa tak krótko, ze aż mi się wierzyć nie chce. Program "mówi" mi iż trwa to zaledwie 2 * 10^(-8) i wszystko by było OK gdybym nie zakładał wyniku w milisekundach, chodzi mi o to czy aż tak szybkie wykonanie tej operacji jest możliwe czy po prostu coś mam nie tak w kodzie.
Pozdrawiam!!!
rozwiązałem problem stosują:
- Kod: Zaznacz wszystko
QueryPerformanceFrequency(&liczba_taktow);
unsigned long double liczba_takt_na_ms = (unsigned long double)liczba_taktow.QuadPart / 1000; // żeby mieć ilość operacji na milisekundę
QueryPerformanceCounter(&czas_start);
// testowany kod
QueryPerformanceCounter(&czas_stop);
czas_silnia = (unsigned long double)liczba_przebiegow / liczba_takt_na_ms;
czas_silnia = czas_silnia/100000; // przez 100000 bo tyle razy wykonuje się testowany kod dla zwiększenia czasu trwania operacji
Tak swoją drogą czy wszystko gra w tym kodzie, gdyż liczenie silni silni ze 100 metodą iteracyjną trwa tak krótko, ze aż mi się wierzyć nie chce. Program "mówi" mi iż trwa to zaledwie 2 * 10^(-8) i wszystko by było OK gdybym nie zakładał wyniku w milisekundach, chodzi mi o to czy aż tak szybkie wykonanie tej operacji jest możliwe czy po prostu coś mam nie tak w kodzie.
Pozdrawiam!!!
- SuperEgo
- Posty: 24
- Rejestracja: 2009-09-06, 17:38
Jest to poprawny wynik testu. Rekurencja jest po prostu bardzo złożonym procesem tak naprawdę (zagłębiając się w to, co się dzieje na poziomie assemblera), iteracja jest natomiast prosta - aczkolwiek niektóre rzeczy lepiej wykonywać iteracyjnie (QSort, BinaryTree traversing, etc).
You know who you are, don't betray yourself.
-

pejs - Posty: 2048
- Rejestracja: 2006-03-22, 20:03
- Miejscowość: Gdańsk
Czyli rozumowanie i program poprawny:-)
Dzięki bardzo za pomoc!!!
Dzięki bardzo za pomoc!!!
- SuperEgo
- Posty: 24
- Rejestracja: 2009-09-06, 17:38
7 posty(ów)
• Strona 1 z 1
Kto jest na forum
Użytkownicy przeglądający to forum: Brak zarejestrowanych użytkowników oraz 1 gość