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+36a+(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言語の浮動小数点演算のあるプログラムは、一演算、一文、 として記述するのが、定石である。