A Book on C 1장 연습문제 17번...
글쓴이: lsj0713 / 작성시간: 수, 2003/11/26 - 9:10오후
/* Compute a better average. */ #include <stdio.h> int main(void) { int i; double x; double avg = 0.0; /* a better average */ double navg; /* a naive average */ double sum = 0.0; printf("%5s%17s%17s%17s\n%5s%17s%17s%17s\n\n", "Count", "Item", "Average", "Naive avg", "-----", "----", "-------", "---------"); for (i = 1; scanf("%lf", &x) == 1; ++i ) { avg += (x - avg) / i; sum += x; navg = sum / i; printf("%5d%17e%17e%17e\n", i, x, avg, navg); } return 0; }
17. 이 연습 문제는 연습 문제 16번에 계속되는 것이다. better_average 프로그램의 입력으로 위와 같은 큰 숫자가 아닌 평범한 숫자를 하용한다면 Average 열과 Naive Avg열은 같을 것처럼 보인다. 두 열의 값이 달라지는 경우를 찾아보아라. 즉, sum이 오버플로 되지 않을 때에도 better_average가 실제로 더 좋은 방법이라는 것을 실험적으로 증명하여라.
A Book on C 1장 연습문제 17번입니다. 도저히 오버플로 이외의 이 알고리즘의 장점을 찾을 수가 없습니다. 해답 아시는 분은 도움 주시길 부탁드립니다. 다른 문제는 다 풀겠는데 이 문제는 지금에 이르러서도 도저히 해답이 나오질 않는군요-_-;
답변해주실 분들께 미리 감사드립니다.
Forums:
정확히는 모르겠습니다만...
double 인 것을 보니 유효숫자문제인 것 같은데요.
float, double 형은 잘 안써봐서 수치해석책 좀 찾아보니..
float, double 형은 잘 안써봐서 수치해석책 좀 찾아보니..
http://www.google.co.kr/search?hl=ko&ie=UTF-8&oe=UTF-8&newwindow=1&q=catastrophic+cancellation+float+point&lr=
이것과 관련한 문제가 아닐까요?
---
http://coolengineer.com
a book on C 연습문제 사이트입니다. ^.^http://c
a book on C 연습문제 사이트입니다. ^.^
http://cosmos.ssu.ac.kr/abc/4ed/
흠. 그곳에서도 17 번 정답을 달아논 분은 없군요...
그렇군요... 부동소수점 연산임으로 비슷한 크기의 숫자간의 계산이 더 정
그렇군요... 부동소수점 연산임으로 비슷한 크기의 숫자간의 계산이 더 정확해 진다는 뜻이네요...
그렇다면... 달라지는 답을 구하기 위해서는 sum이
부동소수점에서 허용하는 자리수 보다가 길어지게 되는 순간 값이 차이가
발생하겠군요..
There is no spoon. Neo from the Matrix 1999.
댓글 달기