Obecny czas: 2010-09-06, 18:11
Zaloguj się

Jaki typ zmiennych do reprezentacji dużych wartości?

Jak w nazwie... Wszystko o programowaniu pod tę platformę. Programowanie.

Moderatorzy: J.Admin, ModTeam

Postprzez SuperEgo » 2010-01-04, 02:38

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!!!
SuperEgo
 
Posty: 24
Rejestracja: 2009-09-06, 17:38

Postprzez pejs » 2010-01-04, 09:19

Istnieją wrappery z javowych BIgIntegerów. dla przykładu:
http://www.codeproject.com/KB/cs/biginteger.aspx
You know who you are, don't betray yourself.
Awatar użytkownika
pejs
 
Posty: 2048
Rejestracja: 2006-03-22, 20:03
Miejscowość: Gdańsk

Postprzez SuperEgo » 2010-01-04, 11:34

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

Postprzez pejs » 2010-01-04, 13:46

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.
You know who you are, don't betray yourself.
Awatar użytkownika
pejs
 
Posty: 2048
Rejestracja: 2006-03-22, 20:03
Miejscowość: Gdańsk

Postprzez SuperEgo » 2010-01-04, 14:53

Dzieki!!!

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

Postprzez pejs » 2010-01-04, 15:13

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.
Awatar użytkownika
pejs
 
Posty: 2048
Rejestracja: 2006-03-22, 20:03
Miejscowość: Gdańsk

Postprzez SuperEgo » 2010-01-04, 15:29

Czyli rozumowanie i program poprawny:-)

Dzięki bardzo za pomoc!!!
SuperEgo
 
Posty: 24
Rejestracja: 2009-09-06, 17:38


Wróć do .NET

Kto jest na forum

Użytkownicy przeglądający to forum: Brak zarejestrowanych użytkowników oraz 1 gość

cron

Kto jest na forum

Na forum jest 1 użytkownik :: 0 zarejestrowanych, 0 ukrytych i 1 gości (oparte na użytkownikach aktywnych przez ostatnie 5 minut)
Najwięcej użytkowników (140) było obecnych 2007-12-12, 06:19

Użytkownicy przeglądający to forum: Brak zarejestrowanych użytkowników oraz 1 gość

Login Form