// overReal.c // http://www.csie.nctu.edu.tw/~tsaiwn/introcs/OTHERS/overflowUnderflow/ 1 #include 2 #define PRE_LOOP 123 3 #define PRE_LOOP22 1020 4 #define PRINT_LOOP 58 5 // PRE_LOOP22 : used for double 6 int main( ) { 7 float a, b; int i; 8 double x, y; 9 10 /**Underflow (虧失) 絕對值太小小到幾乎是 0 以致於被電腦當作 0: 11 整數不會 Underflow, 因為 1 再小就變 0; 12 實數才會:***/ 13 14 printf("a, b are float.\n"); 15 a = 1.0, b= 1.0; 16 for(i=1; i<= PRE_LOOP; ++i) { 17 a = a*2; 18 b = b / 2; 19 } 20 printf("a=%.8f, b=%.8f\n", a, b); // %f 21 for(i=1; i<= PRINT_LOOP; ++i) { 22 a = a*2; // 會 overflow 23 b = b / 2; // 會 underflow 24 printf("a=%.8g, b=%.8g\n", a, b); 25 } 26 /// 27 printf("\nx, y are double.\n"); 28 x = y = 1.0; 29 for(i=1; i<= PRE_LOOP22; ++i) { 30 x = x*2; 31 y = y / 2; 32 } 33 printf("x=%.18f, y=%.18f\n", x, y); // %f 34 for(i=1; i<= PRINT_LOOP; ++i) { 35 x = x*2; // 會 overflow 36 y = y / 2; // 會 underflow 37 printf("x=%.18g, y=%.18g\n", x, y); 38 } 39 } bsd2% gcc overReal.c bsd2% ./a.out a, b are float. a=10633823966279326983230456482242756608.00000000, b=0.00000000 a=2.1267648e+37, b=4.7019774e-38 a=4.2535296e+37, b=2.3509887e-38 a=8.5070592e+37, b=1.1754944e-38 a=1.7014118e+38, b=5.8774718e-39 a=inf, b=2.9387359e-39 a=inf, b=1.4693679e-39 a=inf, b=7.3468397e-40 a=inf, b=3.6734198e-40 a=inf, b=1.8367099e-40 a=inf, b=9.1835496e-41 a=inf, b=4.5917748e-41 a=inf, b=2.2958874e-41 a=inf, b=1.1479437e-41 a=inf, b=5.7397185e-42 a=inf, b=2.8698593e-42 a=inf, b=1.4349296e-42 a=inf, b=7.1746481e-43 a=inf, b=3.5873241e-43 a=inf, b=1.793662e-43 a=inf, b=8.9683102e-44 a=inf, b=4.4841551e-44 a=inf, b=2.2420775e-44 a=inf, b=1.1210388e-44 a=inf, b=5.6051939e-45 a=inf, b=2.8025969e-45 a=inf, b=1.4012985e-45 a=inf, b=0 a=inf, b=0 a=inf, b=0 a=inf, b=0 a=inf, b=0 ... a=inf, b=0 a=inf, b=0 a=inf, b=0 a=inf, b=0 x, y are double. x=11235582092889474423308157442431404585112356118389416079589380072358292237843810195794279832650471001320007117491962084853674360550901038905802964414967132773610493339054092829768888725077880882465817684505312860552384417646403930092119569408801702322709406917786643639996702871154982269052209770601514008576.000000000000000000, y=0.000000000000000000 x=2.24711641857789488e+307, y=4.45014771701440277e-308 x=4.49423283715578977e+307, y=2.22507385850720138e-308 x=8.98846567431157954e+307, y=1.11253692925360069e-308 x=inf, y=5.56268464626800346e-309 x=inf, y=2.78134232313400173e-309 x=inf, y=1.39067116156700086e-309 x=inf, y=6.95335580783500432e-310 x=inf, y=3.47667790391750216e-310 x=inf, y=1.73833895195875108e-310 x=inf, y=8.6916947597937554e-311 x=inf, y=4.3458473798968777e-311 x=inf, y=2.17292368994843885e-311 x=inf, y=1.08646184497421943e-311 x=inf, y=5.43230922487109713e-312 x=inf, y=2.71615461243554856e-312 x=inf, y=1.35807730621777428e-312 x=inf, y=6.79038653108887141e-313 x=inf, y=3.3951932655444357e-313 x=inf, y=1.69759663277221785e-313 x=inf, y=8.48798316386108926e-314 x=inf, y=4.24399158193054463e-314 x=inf, y=2.12199579096527232e-314 x=inf, y=1.06099789548263616e-314 x=inf, y=5.30498947741318079e-315 x=inf, y=2.65249473870659039e-315 x=inf, y=1.3262473693532952e-315 x=inf, y=6.63123684676647598e-316 x=inf, y=3.31561842338323799e-316 x=inf, y=1.657809211691619e-316 x=inf, y=8.28904605845809498e-317 x=inf, y=4.14452302922904749e-317 x=inf, y=2.07226151461452375e-317 x=inf, y=1.03613075730726187e-317 x=inf, y=5.18065378653630936e-318 x=inf, y=2.59032689326815468e-318 x=inf, y=1.29516344663407734e-318 x=inf, y=6.4758172331703867e-319 x=inf, y=3.23790861658519335e-319 x=inf, y=1.61895430829259668e-319 x=inf, y=8.09477154146298338e-320 x=inf, y=4.04738577073149169e-320 x=inf, y=2.02369288536574584e-320 x=inf, y=1.01184644268287292e-320 x=inf, y=5.05923221341436461e-321 x=inf, y=2.52961610670718231e-321 x=inf, y=1.26480805335359115e-321 x=inf, y=6.32404026676795577e-322 x=inf, y=3.16202013338397788e-322 x=inf, y=1.58101006669198894e-322 x=inf, y=7.90505033345994471e-323 x=inf, y=3.95252516672997235e-323 x=inf, y=1.97626258336498618e-323 x=inf, y=9.88131291682493088e-324 x=inf, y=4.94065645841246544e-324 x=inf, y=0 x=inf, y=0 x=inf, y=0 x=inf, y=0