1. 請試著找出整數與浮點數過大溢位(overflow) 和浮點數過小溢位(underflow),請使用嘗試接近的方式來達成。
程式碼如下:
#include “stdafx.h” #include <stdio.h> //引入stdio.h檔 #include <stdlib.h> //引入stdlib.h檔
int main(int argc, char* argv[]) { int i,m1=2147483646; //宣告變數i和變數m1,且m1給初始值為 float k1=1e+36,k2; //宣告k1和k2變數,k1的初始值為的次方 float n1=(float)1e-35,n2; //宣告n1和n2變數,n1的初始值為的-35次方
/——————————————————————–/
printf(“Let’s find the integer overflow\n”); printf(“m1 = %d\n”,m1); for (i=0;i<=3;i++) //使用for迴圈,給i給初始值為,當i小於或等於時停止迴圈,每次迴圈執行完i就加 { printf(“m1 + %d = %d\n”,i,(m1+i)); //印出num1與i的值,觀察情況 } /——————————————————————–/
printf(“\nLet’s find the float overflow\n”); //印出字串,找出浮點數的過大溢位
printf(“k1\t = %e\n”, k1); //印出k1的初始值 k2=(float)1e+36(float)1.0e+1; //讓的次方乘上的次方(輸入為Float),assign給k2 printf(“k1 * (1.0e+1) = %e\n”, k2); //印出結果 k2=(float)1e+36(float)1.0e+2; //讓10的次方乘上的次方,assign給k2 printf(“k1 * (1.0e+2) = %e” “\t//overflow前最大\n”, k2); //印出結果 k2=(float)1e+36(float)1.0e+3; //讓的次方乘上的次方,assign給k2 printf(“k1 * (1.0e+3) = %e\n”, k2); //印出結果 k2=(float)1e+36(float)1.0e+4; //讓10的次方乘上的次方,assign給k2 printf(“k1 * (1.0e+4) = %e\n”, k2); //印出結果 /——————————————————————–/
printf(“\nLet’s find the float underflow\n”); //印出字串,找出浮點數的過小溢位 printf(“n1\t = %e\n”, n1); //印出n1的初始值 n2=(float)1e-35(float)1e-1; //讓10的-35次方乘上的次方(輸入為Float),assign給n2 printf(“n1 * (1e-1) = %e\n”, n2); //印出結果 n2=(float)1e-35(float)1e-2; //讓10的-35次方乘上的次方,assign給n2
printf(“n1 * (1e-2) = %e” “\t//underflow前最小\n”, n2); //印出結果 n2=(float)1e-35(float)1e-3; //讓10的-35次方乘上的次方,assign給n2 printf(“n1 * (1e-3) = %e\n”, n2); //印出結果 n2=(float)1e-35(float)1e-4; //讓10的-35次方乘上的次方,assign給n2 printf(“n1 * (1e-4) = %e\n”, n2); //印出結果
/——————————————————————–/ system(“PAUSE”); //「按任意鍵繼續…」的程式,讓程式暫停 return 0; //函數結束,傳回整數並跳回原本呼叫的地方 } |