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;                              //宣告k1k2變數,k1的初始值為的次方

float n1=(float)1e-35,n2;                       //宣告n1n2變數,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));         //印出num1i的值,觀察情況

     }

/*--------------------------------------------------------------------*/

 

     printf("\nLet's find the float overflow\n");    //印出字串,找出浮點數的過大溢位

    

     printf("k1\t      = %e\n", k1);                 //印出k1的初始值

     k2=(float)1e+36*(float)1.0e+1;                  //讓的次方乘上的次方(輸入為Float)assignk2

     printf("k1 * (1.0e+1) = %e\n", k2);             //印出結果

     k2=(float)1e+36*(float)1.0e+2;                  //10的次方乘上的次方,assignk2

     printf("k1 * (1.0e+2) = %e"

  "\t//overflow前最大\n", k2);                       //印出結果

     k2=(float)1e+36*(float)1.0e+3;                  //讓的次方乘上的次方,assignk2

     printf("k1 * (1.0e+3) = %e\n", k2);             //印出結果

     k2=(float)1e+36*(float)1.0e+4;                  //10的次方乘上的次方,assignk2

     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)assignn2

     printf("n1 * (1e-1) = %e\n", n2);               //印出結果

     n2=(float)1e-35*(float)1e-2;                    //10-35次方乘上的次方,assignn2

 

     printf("n1 * (1e-2) = %e"

              "\t//underflow前最小\n", n2);           //印出結果

     n2=(float)1e-35*(float)1e-3;                    //10-35次方乘上的次方,assignn2

     printf("n1 * (1e-3) = %e\n", n2);               //印出結果

     n2=(float)1e-35*(float)1e-4;                    //10-35次方乘上的次方,assignn2

     printf("n1 * (1e-4) = %e\n", n2);               //印出結果

 

/*--------------------------------------------------------------------*/

     system("PAUSE");                               //「按任意鍵繼續...」的程式,讓程式暫停

     return 0;                                       //函數結束,傳回整數並跳回原本呼叫的地方

}

arrow
arrow
    全站熱搜

    Johnny 鋼鍊 發表在 痞客邦 留言(0) 人氣()