x= a*b/c;と書きそうになる。
double a,b,t;
a=1.0/1e308;
printf("a= %e\n", a);
t= a*3e16;
b= t/3e16;
printf("b= %e\n", b);
--
a= 1.000000e-308
b= 1.000000e-308
特に問題なく、もとの小さな数にもどる。
double a,b,t;
a=1.0/1e308;
printf("a= %e\n", a);
t= a/3e16;
b= t*3e16;
printf("b= %e\n", b);
--
a= 1.000000e-308
b= 0.000000e+00
小さな数に対して、先に除算をする、小さくなりすぎて、0になってしまう。
double a,c,s,t;
a=1e36;
c=1e19;
for(t=0., i=0;i<1000000000;i++)
t+=c;
s=a+t;
--
結果= 1.0000000100000000e+36
a+(c+...+c) という気分である。
double a,c,s;
a=1e36;
c=1e19;
s=a;
for(i=0;i<1000000000;i++)
s+=c;
--
結果= 1.0000000000000000e+36
((((a+c)+c)+...+c) という気分である。a=1.0/1e308; tmp= a/3e16; b= tmp*3e16;一演算子あたり一文とするために、一時変数を用意し、それへどんどん代入しながら、演算を進めるように記述する。
s=a; s+=b; s+=c; s+=d;
t=a*b; t=t/c; s=t*dということで、C言語の浮動小数点演算のあるプログラムは、一演算、一文、 として記述するのが、定石である。