Estoy tratando de calcular una media móvil, y para tratar de obtener y optimizar un poco, he simplificado el cálculo por lo que solo hay una división. Cuando el valor está disminuyendo, hay un punto donde el valor actual se reduce a menos que el promedio. En este punto, el promedio salta. Imagino que esto se debe a que la división no está firmada, y el bit de signo de mi numerador se interpreta como un número masivo sin firmar. Simplemente no estoy seguro de dónde tengo que lanzar sin firmar para asegurarme de que este problema no vuelva a aparecer.División firmada con el numerador sin signo
unsigned int AverageUsage;
unsigned int TotalUsage;
unsigned int incCount;
AverageUsage = (TotalUsage - AverageUsage)/++incCount + AverageUsage;
AverageUsage siempre será positivo, pero cuando cae por debajo de TotalUsage AverageUsage, no estoy seguro de qué esperar de la división
AverageUsage = (signed int)(TotalUsage - AverageUsage)/++incCount + AverageUsage;
fijará el numerador a firmado, pero no estoy seguro cómo ocurrirá la división
AverageUsage = (signed int)((signed int)(TotalUsage - AverageUsage)/++incCount) + AverageUsage;
deben trabajar (Puedo garantizar que el resultado de esta operación completa nunca será negativo), pero estoy preocupado por los casos en que incCount alcanza un valor que 've' negativo.
¿Hay una solución simple a este que se espera:
- no necesita una instrucción if
- No requiere QWords
Gracias!
Sería útil incluir la declaración de todas estas variables. Las reglas de promoción de C dependen de los tipos de las diversas subexpresiones. Por ejemplo, ¿AverageUsage es int? unsigned int? unsigned short? etc. – Nemo
Sospecho de este código; ¿Estás seguro de que esto es aritméticamente correcto y calcula un "promedio móvil" en lugar de un "promedio acumulado"? Un promedio móvil requeriría un buffer de "valores recientes". – Clifford
@Clifford. Es un IIR básico. Probablemente estés pensando en una FIR integradora-peine; que es equivalente a la media de muestra estadística (en ejecución/rodando). De todos modos, ambos son correctos; como filtros de paso bajo y aproximaciones a la media poblacional. –