평균값 프로그램에 관한 문제를 풀다 도저히 모르겠어서 질문 올

elmia의 이미지

A Book on C 에서 1장 17번 문제를 도저히 모르겠네요..

17번 문제를 풀기위해서는 15,16번도 풀어야 하기 때문에

15,16번 문제를 같이 올립니다.

잘 하시는 분들께 도움을 얻고자 글을 올립니다.

-------------------------------------------------------------------------------

15. (스탠포드 대학의 Donald Knuth가 제안한 문제) 1.6절의 running_sum 프로그램에서 평균값을 계산하기 위해 먼저 숫자의 합을 구하고 더해진 숫자의 개수로 그 합을 나누었다. 다음 프로그램 better_average는 평균값을 더 좋은 방법을 사용하여 계산한 것이다.
/* 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;
}

이 프로그램을 수행시켜 보고 원리를 이해하여라. 이 새로운 알고리즘은 평균값을 계산하기 위해 다음 행을 사용하고 있다.
avg += (x - avg) / i;
이 알고리즘이 어떻게 평균값을 구하게 되는지 설명하여라. 힌트: 먼저 손으로 단순한 예를 계산해 보아라.

16. 이 연습 문제는 연습 문제 15번의 better_average 프로그램에서 sum이 컴퓨터에서 표현 가능한 값보다 더 큰 값을 가질 때 어떤 일이 발생하는지를 알아본다. (double 형이 가질 수 있는 값에 대한 상세한 것은 3.6절 "부동형"을 참조하여라.) data라는 파일을 만들어 다음 숫자들을 그 파일에 써넣어라.
1e308 1 1e308 1 1e308
그 다음 data 파일을 better_average의 입력 파일로 재지정한 후 수행시켜 보아라. 이 알고리즘의 장점을 알겠는가?

[ 해보시면 아시겠지만, avg의 값은 이상없이 잘 나오는 반면
navg는 infinity 또는 에러가 날 것입니다. 이것이 평균을 구하는 새로운 방법의 장점입니다 ]

17. (고급) better_ average 프로그램의 입력으로 위와 같은 큰 숫자가 아닌 평범한 숫자를 사용한다면, Average 열과 Naive Avg 열은 같을 것처럼 보인다. 두 열의 값이 달라지는 경우를 찾아보아라. 즉, sum이 오버플로 되지 않을 때에도 better_average가 실제로 더 좋은 방법이라는 것을 실험적으로 증명하여라.

http://cosmos.ssu.ac.kr/abc4h.html 여기가 책 홈페이지..입니다

=_=)a 17번을 아무리 생각해봐도 잘 모르겠네요..
오버플로우 이외에 어떤 장점이 있는지..
아시는 분은 도움의 손길을;;

좋은하루되세요 +_+)/

익명 사용자의 이미지

kihoori의 이미지

#include <stdio.h>
int main(void)
{
int i;
double avg = 0.0; /* a better average */
double navg; /* a naive average */
double sum = 0.0;
int y;
printf("%5s%17s%17s%17s\n%5s%17s%17s%17s\n\n",
"Count", "Item", "Average", "Naive avg",
"-----", "----", "-------", "---------");
for (i = 1 ;  ; ++i) {
int x=rand()%10;
avg += ( x- avg) / i;
sum += x;
navg = sum / i;

        printf("%5d%17d%17e%17e\n", i, x, avg, navg);

//평균이 다르면 스탑하게 만드러써여

if(avg != navg)
{
        scanf("%s",&y);
}
}
return 0;
}

그리고 그것의 결과 인데요..

[root@ns test]# ./test
Count Item Average Naive avg
----- ---- ------- ---------

1 3 3.000000e+00 3.000000e+00
2 6 4.500000e+00 4.500000e+00
3 7 5.333333e+00 5.333333e+00
4 5 5.250000e+00 5.250000e+00
5 3 4.800000e+00 4.800000e+00
6 5 4.833333e+00 4.833333e+00
7 6 5.000000e+00 5.000000e+00
8 2 4.625000e+00 4.625000e+00
9 9 5.111111e+00 5.111111e+00
10 1 4.700000e+00 4.700000e+00
// 여기서 한번 틀리다고 스톱
11 2 4.454545e+00 4.454545e+00
12 7 4.666667e+00 4.666667e+00
// 여기서 또 한번 틀리다고 스톱
13 0 4.307692e+00 4.307692e+00
14 9 4.642857e+00 4.642857e+00
//여기서 또 한번 틀리다고 스톱

이상인데.. 머가 틀리다고 스톱이 된건지 모르겠네요.. 소스가 이상한가..ㅡ.ㅡ;;

환경은 리눅이 gcc 2.96에서 컴파일했습니다

익명 사용자의 이미지

kihoori의 이미지

소수점 아래 나온데 까지에서 반올림되어 출력되었습니다..

그래서 출력된곳 밑으로는 전부 000이라고 할수 있져..

elmia의 이미지

마이클러스트님께서 말하신대로 언더 플로우로 해서 해보니까

-infinity도 나오는군요..

답은 아마 그게 아닐가 싶습니다..

^^;

좋은하루되세요~!

+_+)a 키후리님도 감사합니다~

Music is the greatest communication in the world.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.