|
はじめまして。
過去掲示板(No45など)で、誤差について扱われていましたが、
分かりづらいところがあるので、質問します。
丸め誤差、打切り誤差のほかに色々な誤差があることも分かりました。
ですが、繰り返しの計算回数を変えたときに誤差がマイナスのほうから
プラスのほうに変わってしまう理由が分かりません。
/* ある実数を100回足した結果と1000足した結果 */
#include <stdio.h>
#define I 100
#define J 1000
int main(void)
{
int i;
float s,t,x;
s = 0.0;
t = 0.0;
puts("実数を入力してから、CTRL+Zを押してください。");
scanf("%f\n", &x);
for (i = 1; i <= I; i++){
t = t + x;
}
for (i = 1; i <= J; i++){
s = s + x;
}
printf("%gを%d回足すと%fです。\n",x,I,t);
printf("%gを%d回足すと%fです。\n",x,J,s);
return (0);
}
まず、値に0.01を使いました。2進数にしたときに、無限小数となり
有限長では表現できないために誤差はおきます。ですから100回足し算を
繰り返すと0.999999になるのは何となく分かります。途中で打ち切って
(丸めて)表現するのだから、少なくなるのだろうな...と。ですが、
1000回足すと10.000134となり、正しい値から増えるのが分かりません。
なぜこの場合は増えるのでしょうか? また、入力する値が0.1のときは
100回のときに増えて、1000回のときには減っています。
使用しているCコンパイラはLSIC86試食版です。よろしくお願いします。
|