[C] Zmienne typu double i dziwne wartości -1.#INF00

0

Witam

mam problem z wartościami funkcji typu double.

Otóż potrzebuję w swoim programie dokładnego pomiaru czasu. Korzystam w tym celu z funkcji QueryPerformanceCounter z bibliteki <windows.h> w następujący sposób:

LARGE_INTEGER start, end; // deklaracja zmiennych typu LARGE_INTEGER, zdefiniowanego w windows.h

QueryPerformanceCounter(&start);
sleep(100);	// badany kod, dla przykladu moze byc np. instrukcja zatrzymania na powiedzmy 100 ms
QueryPerformanceCounter(&end);

double diff = timeDiff(start, end);	// wywolanie funkcji timeDiff, definicja ponizej
double timeDiff(LARGE_INTEGER start, LARGE_INTEGER end) {		/* precise clock procedure */
	/* time is measured in miliseconds */
	LARGE_INTEGER freq;
	double time;
	if(!QueryPerformanceFrequency(&freq)) {                   /* if problem */
		printf("Computing exact time is impossible. Program will be aborted.\n");
		stop();
		abort(); /* exit program */
	}
	else /* return computed value */ {
		time = ((double) end.QuadPart) - ((double) start.QuadPart);
		time /= (double) freq.QuadPart;
		time *= 1000.0;
		/* Tutaj zmienna time ma prawidlowa wartosc: ok. 100 milisekund, co sie zgadza z czasem podanym do funkcji sleep() */
		return time;
	}
}

Problem polega na tym, że o ile zmienna time ma prawidlowa wartosc wewnatrz funkcji, to po jej zwroceniu juz tak nie jest i zmienna diff, do której przypisuję wartość funkcji timeDiff, zawiera dziwną wartość -1.#INF00.

Słyszałem, że może to być związane z jakimiś problemami z rejestrami procesora, ale generalnie to podobno rzadki błąd. Nie mam pojęcia, skąd się bierze i jak go rozwiązać. Byłbym wdzięczny za pomoc.

0

Sprawdzałem u siebie, program zwraca poprawne wartości (np. 0.000838095)...

0

To dlaczego pokazujesz kod, z którym nie ma problemu ? Pokaż to miejsce, gdzie wywołujesz funkcje i sprawdzasz wartość. Problem prawdopodobnie jest w tym jak sprawdzasz tą wartość - sprawdzasz nie to co trzeba lub nie tak jak trzeba.

time = ((double) end.QuadPart) - ((double) start.QuadPart);
time /= (double) freq.QuadPart;
time *= 1000.0;
Dokładniej będzie tak:

time = 1000 * (end.QuadPart - start.QuadPart);
time /= freq.QuadPart;
0

Nie odpisywałem tak długo, bo testowałem to na wszelkie możliwe sposoby.

Problem, jak się okazało, miał banalne rozwiązanie - funkcja timeDiff była zainclude'owana z osobnego pliku źródłowego. Były bardzo dziwne błędy z przekazywaniem wartości, bo po prostu zabrakło deklaracji tej funkcji w pliku nagłówkowym *.h. Po poprawieniu tego działa elegancko.

Zatem mea culpa i moje zaniedbanie. W każdym razie, dziękuję za chęć pomocy.

0

jesli dokladnie to bylo problemem, to rzeczywiscie byl problem z 'rejestrami' - w tym wlasciwym pliku naglowkowym, przy deklaracji funkcji, pewnie widnieje (albo wlasnie nie-widnieje) jakies __stdcall, __cdecl, WINAPI, CALLBACK itp ktore podpowiada kompilatorowi w jaki sposob (stos, rejestry..) ta funkcja musi miec przekazane parametry i odebrane wartosci zwracane. swoja droga, maly cud ze w ogole dzialalo a nie wywalalo bledem uszkodzenia stosu:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1