Próbuję obliczyć średnią kroczącą, a aby spróbować i uzyskać i zoptymalizować nieco, uprościłem obliczenia, więc istnieje tylko jeden podział. Kiedy wartość maleje, istnieje punkt, w którym aktualna wartość jest obniżana do wartości niższej niż średnia. W tym momencie średnia liczba skoków. Wyobrażam sobie, że dzieje się tak dlatego, że podział jest niepodpisany, a bit znaku licznika jest interpretowany jako masywna liczba bez znaku. Po prostu nie jestem pewien, gdzie muszę rzucać niepodpisane, aby upewnić się, że problem nie pojawia się ponownie.Podpisany podział z unsigned licznikiem
unsigned int AverageUsage;
unsigned int TotalUsage;
unsigned int incCount;
AverageUsage = (TotalUsage - AverageUsage)/++incCount + AverageUsage;
AverageUsage zawsze będzie dodatni, ale kiedy TotalUsage spadnie poniżej AverageUsage, nie jestem pewien, czego się spodziewać z podziałem
AverageUsage = (signed int)(TotalUsage - AverageUsage)/++incCount + AverageUsage;
ustawi licznik do podpisanej, ale nie jestem pewien jak podział się pojawi.
AverageUsage = (signed int)((signed int)(TotalUsage - AverageUsage)/++incCount) + AverageUsage;
powinien działać (mogę zagwarantować wynik tej operacji pełnego nigdy nie będzie ujemny), ale martwię się o przypadkach gdy incCount osiąga wartość, że „wygląd” ujemną.
Czy istnieje proste rozwiązanie do tego, że z nadzieją:
- nie potrzebuje if
- Nie wymaga QWORDs
Dzięki!
Byłoby pomocne, gdyby dołączyć deklarację wszystkich tych zmiennych. Zasady promocji C zależą od typów różnych podwyrażeń. Na przykład, czy AverageUsage int? unsigned int? Niepodpisany krótki? itp. – Nemo
Jestem podejrzliwy wobec tego kodu; czy jesteś pewien, że jest to poprawne arytmetycznie i oblicza "średnią kroczącą", a nie "łączną średnią"? Średnia krocząca wymagałaby bufora "ostatnich wartości". – Clifford
@ Clifford. Jest to podstawowe IIR. Prawdopodobnie myślisz o integratorze-grzebieniu FIR; który jest równoważny statystycznej średniej próbki (running/rolling). Bez względu na to, są one poprawne; jako filtry dolnoprzepustowe i przybliżenia do średniej populacji. –