数値計算と誤差 (1)


今日の内容


C 言語で書かれたプログラムの動かし方

3つの数の最大公約数を求めるプログラム

/* gcd.c
   3つの整数の最大公約数を求めるプログラム */

#include <stdio.h>

int gcd(int x, int y) {
  int r;
  r = x % y;
  while (r > 0) {
    x = y;
    y = r;
    r = x % y;
  }
  return y;
}

int main(void) {
  int s, t, u;
  scanf("%d", &s);
  scanf("%d", &t);
  scanf("%d", &u);
  printf("%d\n", gcd(gcd(s, t), u));
}
# cc gcd.c

# ./a.exe
12
8
40
4

#

[演習 13.1]

  1. C 言語のプログラムを保存するために,ディレクトリ c を mkdir で作りなさい.
  2. ディレクトリ c に移動し,上の C 言語のプログラムをファイル gcd.c にエディタを使って書き,保存しなさい.
  3. プログラムを実行しなさい.

数値計算での変な現象

整数の計算での変な現象 (オーバーフロー)

/* int_overflow.c
   整数計算での変な現象 */

#include <stdio.h>     // 入出力のライブラリを使う宣言

int main(void) {       // C 言語は関数 main から実行が始まる.
  int i;               // int で変数 i が整数型であることを示す.
  i = 1;               // 文の区切りを ; で表す.
  while (i > 0) {
    i = i + 1;
  }
  printf("%d \n", i);  /* 関数 printf の第1引数は,文字列で出力の形式を表す.
                            %d は10進数による数の表現.
                            \n は改行を表す.
			  第2引数以後は,%d などで表示される変数を現れる順番に記述する.*/
}
# cc int_overflow.c

# ./a.exe
-2147483648

#

[演習 13.2]

  1. プログラムを実行しなさい.
  2. 1から1ずつ大きくしたのに何故負の数になってしまうのだろうか?

[問題 13.1]


誤差

丸め誤差

[問題 13.2]

/* round-off_error.c
   丸め誤差の例 */

#include <stdio.h> 

int main(void) {
  double d1 = 1.0 - 0.9;
  double d2 = 0.1;
  if (d1 == d2) {
    printf("d1 is %g and d2 is %g, then d1 == d2 is true.\n", d1, d2);
  } else {
    printf("d1 is %g and d2 is %g, but d1 == d2 is false.\n", d1, d2);
    printf("d1 - d2 = %g\n", d1-d2);
  }
}

[演習 13.3]

情報落ち

/* taylor.c
   情報落ちの例: log 1.5 の計算 */

#include <stdio.h>
#include <math.h>

int main(void) {
  int i, j;
  double s, x;
  s = 0;
  for (i = 1; i <= 100; i++) {
    x = i;
    for (j = 0; j < i; j++) {
      x = x * 2;
    }
    if (i % 2 == 0) {
      s = s - 1/x;
    } else {
      s = s + 1/x;
    }
  }
  printf("%.20f\n", s);
}

[演習 13.4]

[問題 13.3]

桁落ち

[問題 13.4]

$ ./a.exe
a=1.0000000000000000e+00
b=1.0000010000000000e+03
c=1.0000000000000000e+00
x1=-9.9999999997635314e-04
x2=-1.0000000000000000e+03
$

次回の予告


2013年1月7日作成
2013年1月10日修正
伊知地 宏
Copyright (C) Hiroshi Ichiji, 2013. All rights reserved.