#include <stdio.h>

#include <float.h>


double average(double values[], int count) {

double avg = 0.0f;

int avg_count = 0;


double sum = 0.0f, newsum = 0.0f;

int sum_count = 0;


for(int i = 0; i < count; i++) {

newsum += values[i];

if(newsum > DBL_MAX) { // infinity

// sum??average??諛섏쁺

avg = avg * avg_count / (avg_count + sum_count) +

sum / (avg_count + sum_count);

avg_count += sum_count;


// sum??珥덇린?? sum = values[i];

sum_count = 1;

} else {

sum = newsum;

sum_count++;

}

}


if(sum_count) {

avg = avg * avg_count / (avg_count + sum_count) +

sum / (avg_count + sum_count);

avg_count += sum_count;

}


return avg;

}


int main(void) {

double d[100];

for(int i = 0; i < 100; i++) {

d[i] = DBL_MAX;

}


if(average(d, 100) == DBL_MAX) {

printf("[+] Success!\\n");

} else {

printf("[!] Fail!\\n");

}


return 0;

}


오버플로가 일어날 때까지는 합을 구하다가

오버플로가 일어나는 시점에서는 평균으로 반영하고 합은 새로 구함.


기존에 n 개에 대한 평균 a가 있다고 할 때,

새로운 값 m 개의 합계 s를 반영한 새로운 평균 a'는


a' = a * n / (n + m) + s / (n + m)


으로 구할 수 있음. 기존 평균에서 곱셈 나눗셈 연산으로 분모만 바꿔서 평균을 재활용하는 거지.