Signed division with unsigned numerator

I'm trying to calculate a rolling average, and to try and get and optimize a bit, I've simplified the calculation so there is only one division. When the value is decreasing, there is a point where the current value is lowered to less than the average. At this point the average jumps. I imagine this is because the division is unsigned, and my numerator's sign bit is interpreted as a massive unsigned number. I am just not sure where I need to cast unsigned to insure this problem doesn't reappear.

unsigned int AverageUsage;
unsigned int TotalUsage;
unsigned int incCount;

    AverageUsage = (TotalUsage - AverageUsage)/++incCount + AverageUsage;

AverageUsage will always be positive, but when TotalUsage drops below AverageUsage, I'm not sure what to expect with the division

    AverageUsage = (signed int)(TotalUsage - AverageUsage)/++incCount + AverageUsage;

Will set the numerator to signed, but I am not sure how the division will occur.

    AverageUsage =  (signed int)((signed int)(TotalUsage - AverageUsage)/++incCount) + AverageUsage;

Should work (I can guarantee the result of this full operation will never be negative), but I am worried about cases when incCount reaches a value that 'looks' negative.

Is there a simple solution to this that hopefully:

  • Doesn't need an if statement
  • Doesn't require QWORDs

Thanks!

7
задан Gdogg 27 May 2011 в 21:52
поделиться