123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- PJ_BEGIN_DECL
- typedef struct pj_math_stat
- {
- int n;
- int max;
- int min;
- int last;
- int mean;
-
- float fmean_;
- int mean_res_;
- pj_highprec_t m2_;
- } pj_math_stat;
- PJ_INLINE(unsigned) pj_isqrt(unsigned i)
- {
- unsigned res = 1, prev;
-
-
- prev = i >> 2;
- while (prev) {
- prev >>= 2;
- res <<= 1;
- }
-
- do {
- prev = res;
- res = (prev + i/prev) >> 1;
- } while ((prev+res)>>1 != res);
- return res;
- }
- PJ_INLINE(void) pj_math_stat_init(pj_math_stat *stat)
- {
- pj_bzero(stat, sizeof(pj_math_stat));
- }
- PJ_INLINE(void) pj_math_stat_update(pj_math_stat *stat, int val)
- {
- float delta;
- int delta;
- stat->last = val;
-
- if (stat->n++) {
- if (stat->min > val)
- stat->min = val;
- if (stat->max < val)
- stat->max = val;
- } else {
- stat->min = stat->max = val;
- }
- delta = val - stat->fmean_;
- stat->fmean_ += delta/stat->n;
-
-
- stat->mean = (int) (stat->fmean_ + 0.5);
- stat->m2_ += (int)(delta * (val-stat->fmean_));
- delta = val - stat->mean;
- stat->mean += delta/stat->n;
- stat->mean_res_ += delta % stat->n;
- if (stat->mean_res_ >= stat->n) {
- ++stat->mean;
- stat->mean_res_ -= stat->n;
- } else if (stat->mean_res_ <= -stat->n) {
- --stat->mean;
- stat->mean_res_ += stat->n;
- }
- stat->m2_ += delta * (val-stat->mean);
- }
- PJ_INLINE(unsigned) pj_math_stat_get_stddev(const pj_math_stat *stat)
- {
- if (stat->n == 0) return 0;
- return (pj_isqrt((unsigned)(stat->m2_/stat->n)));
- }
- PJ_INLINE(void) pj_math_stat_set_stddev(pj_math_stat *stat, unsigned dev)
- {
- if (stat->n == 0)
- stat->n = 1;
- stat->m2_ = dev*dev*stat->n;
- }
- PJ_END_DECL
|