#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)
으로 구할 수 있음. 기존 평균에서 곱셈 나눗셈 연산으로 분모만 바꿔서 평균을 재활용하는 거지.
응? 글 다시 써야 겠다.
double 에 0.0f 대입하면서 정답이래.
맞다..아따시도 바보였어요ㅠㅠ..
http://dblack.tk
커뮤니티 사이트 입니다 많은 이용 부탁 드립니다.